调试循环c ++ undefined变量,是什么类型的?豪格伦德

时间:2010-02-16 23:23:18

标签: c++ visual-studio-2008

我一直在阅读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...行不起作用?
  3. 项目是否应该用C而不是C ++编译,因为这与书中完全一样?

    谢谢,R。

2 个答案:

答案 0 :(得分: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()等,也可以将项目设置为使用多字节字符集(项目属性 - &gt;配置 - &gt; general - &gt;字符集)

unicode-character-set也是atoi()语句不起作用的原因:
argv是一个_TCHAR*的数组,_TCHARwchar_t,用于unicode-builds。 atoi()但是需要一个const char*参数,而你正在给它wchar_t* 因此,您可以再次使用多字节字符集,转换字符串或使用Microsofts _wtoi()/_ttoi()

为了便于在字符集之间切换并坚持使用书籍的风格,请选择_T*_t*版本。

答案 1 :(得分:1)

  1. 缺少fDebugSetProcessKillOnExit的声明;可能它应该像
  2. DEBUGSETPROCESSKILLONEXIT fDebugSetProcessKillOnExit;
    

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

    1. 您正在使用Unicode进行编译,并且本书“认为”您正在使用ANSI进行编译;您应该使用_T()宏将传递给API的字符串更改为通用字符串。
    2. 因此,要总结一切,您只需更改一行并添加typedef:

      typedef BOOL (*DEBUGSETPROCESSKILLONEXIT)(BOOL);
      //load the ptr to fDebugSetProcessKillOnExit
      DEBUGSETPROCESSKILLONEXIT fDebugSetProcessKillOnExit = (DEBUGSETPROCESSKILLONEXIT) GetProcAddress(GetModuleHandle(_T("kernel32.dll")), _T("DebugSetProcessKillOnExit"));