2010-02-16 25 views
0

我一直在阅读Hoglund的其中一本书,尽管我的阅读很棒,但是我可以让它工作吗?他们为什么在书中提供非工作例子?调试循环C++未定义变量,什么类型? Hoglund

#include "stdafx.h" 
#include <cstdio> 
#include <windows.h> 
#include <winbase.h> 
#include <tlhelp32.h> 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    HANDLE hProcess; 
    DEBUG_EVENT dbg_evt; 
    int aPID; 

    if(argc != 2) 
    { 
     printf("wrong number of params\nusage %s<pid>\n", argv[0]); 
     return 0; 
    } 

    //load the ptr to fDebugSetProcessKillOnExit 
    fDebugSetProcessKillOnExit = (DEBUGSETPROCESSKILLONEXIT) 
    GetProcAddress(GetModuleHandle("kernel32.dll"), 
    "DebugSetProcessKillOnExit"); 
    if(!fDebugSetProcessKillOnExit) 
    { 
     printf("[!] failed to get fDebugSetProcessKillOnExit function!\n"); 
    } 

    aPID = atoi(argv[1]); 
} 

我得到两个错误消息:

  1. fDebugSetProcessKillOnExit is an undeclared identifier
    它应该是什么类型?
  2. "Error 4 error C2664: 'GetModuleHandleW' : cannot convert parameter 1 from 'const char [13]' to 'LPCWSTR'
    fDebug...应该是什么类型?为什么aPid = atoi...系列不工作?

该项目应该用C语言而不是C++语言编译,因为这与本书完全相同?

感谢,R.

+3

。 – 2010-02-16 23:26:26

+0

你有没有检查勘误的例子? – osgx 2010-02-16 23:26:41

+0

克里斯,这是有趣的:) osgx,我没有,但似乎没有要任何,我累了,我可能错过了他们... – flavour404 2010-02-17 01:56:40

回答

2

采取这种从MSDN:

BOOL WINAPI DebugSetProcessKillOnExit(__in BOOL KillOnExit); 

你可以声明函数指针为:

BOOL (*fDebugSetProcessKillOnExit)(BOOL) = /* ... */; 

或使用typedef缓解你的眼睛:

typedef BOOL (*DebugKillPtr)(BOOL); 
DebugKillPtr fDebugSetProcessKillOnExit = /* ... */; 

函数指针可能有点令人困惑,InformITs guide on them应该对此有所帮助。

此外,您正在使用Unicode构建。您可以使用GetModuleHandle(L"Kernel32.dll")_T()等或将项目设置为使用多字节字符集(项目属性 - >配置 - >常规 - >字符集)

Unicode的字符集也是为什么atoi()语句不能正常工作的原因:
argv_TCHAR*秒的数组,_TCHARwchar_t对Unicode的构建。然而,atoi()预计会出现const char*的说法,并且您将其交给wchar_t*
因此,您可以再次使用多字节字符集,转换字符串或使用Microsofts _wtoi()/_ttoi()

为了简化字符集之间的切换并坚持本书的风格,更喜欢_T*_t*版本。

+0

我确实改变了项目中使用的多字节字符集。我很好奇,想知道为什么每个人都有优势?耶,它的作品。谢谢。 – flavour404 2010-02-16 23:53:28

+0

注意最后一个注释 - 如果你坚持到'_t *'/'_T *'风格你不应该需要担心切换字符集。看到这里MS'采取MBCS和UCS:http://msdn.microsoft.com/en-us/library/cwe8bzh0%28VS.80%29.aspx – 2010-02-16 23:57:49

1
  1. fDebugSetProcessKillOnExit的声明缺失;也许它应该像

 

DEBUGSETPROCESSKILLONEXIT fDebugSetProcessKillOnExit; 

其中DEBUGSETPROCESSKILLONEXIT应该是一个typedef该函数的原型。

  1. 您正在使用Unicode进行编译,并且该书“认为”您正在使用ANSI进行编译;您应该使用_T()宏将传递给API的字符串更改为泛型字符串。

所以,总结了一切,你应该简单地改变一行,并添加类型定义:

typedef BOOL (*DEBUGSETPROCESSKILLONEXIT)(BOOL); 
//load the ptr to fDebugSetProcessKillOnExit 
DEBUGSETPROCESSKILLONEXIT fDebugSetProcessKillOnExit = (DEBUGSETPROCESSKILLONEXIT) GetProcAddress(GetModuleHandle(_T("kernel32.dll")), _T("DebugSetProcessKillOnExit")); 
每次看到这个“微软C”我想我在寻找另一种语言时
+0

谢谢。我对这个问题的多字节部分非常感兴趣,但这是一个艰难的选择。谢谢。 – flavour404 2010-02-16 23:55:11