封装一个类的问题!(在线等)

delphiwcdj 2009-09-03 10:22:18
网上有一段关于隐藏xp进程的代码,我想把它封装到一个HideProcess类中,可是在程序引用时出错,访问不到我这个类中定义的函数

具体封装如下:

// HideProcess.h : header file
//
#if !defined HIDEPROCESS
#define HIDEPROCESS


#include"windows.h"
#include"Accctrl.h"
#include"Aclapi.h"

#define NT_SUCCESS(Status)((NTSTATUS)(Status) >= 0)
#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L)
#define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L)

typedef LONG NTSTATUS;

typedef struct _IO_STATUS_BLOCK
{
NTSTATUS Status;
ULONG Information;
} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;

typedef struct _UNICODE_STRING
{
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
} UNICODE_STRING, *PUNICODE_STRING;

#define OBJ_INHERIT 0x00000002L
#define OBJ_PERMANENT 0x00000010L
#define OBJ_EXCLUSIVE 0x00000020L
#define OBJ_CASE_INSENSITIVE 0x00000040L
#define OBJ_OPENIF 0x00000080L
#define OBJ_OPENLINK 0x00000100L
#define OBJ_KERNEL_HANDLE 0x00000200L
#define OBJ_VALID_ATTRIBUTES 0x000003F2L

...

/////////////////////////////////////////////////////////////////////////////
// CHideProcess

class CHideProcess
{
// Construction
public:

CHideProcess(); // constructor


BOOL HideProcess();

BOOL YHideProcess();
long __stdcall exeception(struct _EXCEPTION_POINTERS *tmp);
BOOL SetData(PVOID addr, ULONG data);
ULONG GetData(PVOID addr);
PVOID LinearToPhys(PULONG BaseAddress, PVOID addr);
HANDLE OpenPhysicalMemory();
void SetPhyscialMemorySectionCanBeWrited(HANDLE hSection);
void CloseNTDLL();
BOOL InitNTDLL();


RTLINITUNICODESTRING RtlInitUnicodeString;
ZWOPENSECTION ZwOpenSection;
HMODULE g_hNtDLL;
PVOID g_pMapPhysicalMemory;
HANDLE g_hMPM;
OSVERSIONINFO g_osvi;

};

#endif


// HideProcess.cpp : implementation file
//

#include "HideProcess.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CHideProcess

CHideProcess::CHideProcess()
{
}
/////////////////////////////////////////////////////////////////////////////
// CHideProcess function

BOOL CHideProcess::InitNTDLL()
{
g_hNtDLL = LoadLibrary("ntdll.dll");

if (NULL == g_hNtDLL)
return FALSE;

RtlInitUnicodeString = (RTLINITUNICODESTRING)GetProcAddress( g_hNtDLL,
"RtlInitUnicodeString");

ZwOpenSection = (ZWOPENSECTION)GetProcAddress( g_hNtDLL, "ZwOpenSection");

return TRUE;
}
...



/////////////////////////////////////////////////

想在别的程序中调用这个类中的函数访问不到,编译器提示:未定义

请问大侠是哪里的错误?谢谢!!!
...全文
167 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
seu_liujie 2009-09-04
  • 打赏
  • 举报
回复
你是在对象中调用还是直接调用啊?直接调用的话加上CHideProcess作用域啊。实在不行可以用单步调试,一看就知道它往哪跑了。
delphiwcdj 2009-09-04
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 feiyangdn 的回复:]
别改编译条件,在mfc中每个cpp文件都要含文件stdafx.h
在HideProcess.cpp 中加

#include "stdafx.h"
[/Quote]

正解!
delphiwcdj 2009-09-04
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 xylicon 的回复:]
引用 12 楼 delphiwcdj 的回复:
但是,我还是想知道调用函数的方法为什么不行? 希望有人能帮忙! 我会给分的!!!


因为你封装在类里了,所以不能直接写类里面的函数HideProcess(); 这样来调用。可以声明一个对象,CHideProcess hidePro; hidePro.HideProcess(); 这样调用。或者把HideProcess()函数声明为static 静态函数,通过CHideProcess::HideProcess(); 这样调用就不需要声明一个对象了。
[/Quote]

正解!
feiyangdn 2009-09-04
  • 打赏
  • 举报
回复
别改编译条件,在mfc中每个cpp文件都要含文件stdafx.h
在HideProcess.cpp 中加

#include "stdafx.h"
xylicon 2009-09-04
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 delphiwcdj 的回复:]
但是,我还是想知道调用函数的方法为什么不行? 希望有人能帮忙! 我会给分的!!!
[/Quote]

因为你封装在类里了,所以不能直接写类里面的函数HideProcess(); 这样来调用。可以声明一个对象,CHideProcess hidePro; hidePro.HideProcess(); 这样调用。或者把HideProcess()函数声明为static 静态函数,通过CHideProcess::HideProcess(); 这样调用就不需要声明一个对象了。
S_S_Ge 2009-09-04
  • 打赏
  • 举报
回复
mark
学习了
delphiwcdj 2009-09-04
  • 打赏
  • 举报
回复
但是,我还是想知道调用函数的方法为什么不行? 希望有人能帮忙! 我会给分的!!!
delphiwcdj 2009-09-04
  • 打赏
  • 举报
回复
虽然上面的调用函数没实现

最后我改成:在使用的类中声明一个这个封装类的对象,可以达到效果

CHideProcess hidePro; //把以前想调用的函数里的代码放到CHideProcess的构造函数中,这样可以隐藏进程了
delphiwcdj 2009-09-04
  • 打赏
  • 举报
回复
to:xylicon
谢谢你帮忙啊!

我加了:
// HideProcess.cpp : implementation file
//
#include "StdAfx.h"
#include "HideProcess.h"
...

// HideProcess.h : header file
//
#if !defined MY_HIDEPROCESS
#define MY_HIDEPROCESS

#include <windows.h>
#include <Accctrl.h>
#include <Aclapi.h>
...


想调用这个类的函数还是访问不了,总是提示未定义
这是功能代码:http://www.diybl.com/course/6_system/winxp/2008324/106186.html#
我想封装为一个类,在别的程序中使用方便



xylicon 2009-09-04
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 delphiwcdj 的回复:]
并且在工程中的每个.cpp中都#include "StdAfx.h"???为什么?

我在HideProcess.cpp中添加#include "StdAfx.h",编译结果如下:

error C2065: 'HideProcess' : undeclared identifier
[/Quote]

你不会是把HideProcess.cpp中的#include "HideProcess.h" 这个去掉了吧。
delphiwcdj 2009-09-04
  • 打赏
  • 举报
回复
顶一下,希望有人解答!
delphiwcdj 2009-09-03
  • 打赏
  • 举报
回复
一定是编译顺序出错了
delphiwcdj 2009-09-03
  • 打赏
  • 举报
回复
并且在工程中的每个.cpp中都#include "StdAfx.h"???为什么?

我在HideProcess.cpp中添加#include "StdAfx.h",编译结果如下:

error C2065: 'HideProcess' : undeclared identifier
xylicon 2009-09-03
  • 打赏
  • 举报
回复
选择use precompiled header。并且在工程中的每个.cpp中都#include "StdAfx.h" 包括// HideProcess.cpp 这个cpp也要包含StdAfx.h
delphiwcdj 2009-09-03
  • 打赏
  • 举报
回复
我想可能还是unexpected end of file while looking for precompiled header directive 的问题

我觉得编译器就没有include "HideProcess.h" (虽然我写了这句话)
delphiwcdj 2009-09-03
  • 打赏
  • 举报
回复
是的 在调用的地方包含了
xylicon 2009-09-03
  • 打赏
  • 举报
回复
这个别的程序包含了类的头文件了吗?#include "HideProcess.h"
delphiwcdj 2009-09-03
  • 打赏
  • 举报
回复
我是在另外一个基于对话框的MFC程序中引用这个类

开始编译器提示:unexpected end of file while looking for precompiled header directive

我改了一下设置,在precompiled header中将选项置成no use ,后来没有这个错误了,
但是在调用上面那个封装类中的函数的时候,编译器提示没有定义。

以前只是经常使用别人写好的类,现在自己写一个类,却有这么多问题。

请大家指教!万分感谢!

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧