цикл отладки c ++ неопределенная переменная, какого типа? Хогланд - PullRequest
0 голосов
/ 17 февраля 2010

Я читал одно из названий Хоглунда, и я, хотя, читал отлично, но могу ли я заставить его работать? Почему они приводят нерабочие примеры в книгах?

#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 ++, как это именно так, как в книге?

Спасибо, Р.

Ответы [ 2 ]

2 голосов
/ 17 февраля 2010

Принимая это из MSDN:

BOOL WINAPI DebugSetProcessKillOnExit(__in  BOOL KillOnExit);

Вы можете объявить указатель функции как:

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

или ослабьте глаза, используя typedef:

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

Указатели на функции могут несколько запутывать, Руководство InformIT по ним должно помочь с этим.

Кроме того, вы используете сборку Unicode. Вы можете использовать GetModuleHandle(L"Kernel32.dll") или _T() и т. Д. Или настроить свой проект на использование многобайтового набора символов (свойства проекта -> конфигурация -> общие -> набор символов) .

Набор символов Unicode также является причиной, по которой оператор atoi() не может работать:
argv - это массив _TCHAR* с, а _TCHAR - это wchar_t для юникод-сборок. atoi() однако ожидает аргумент const char*, а вы передаете его wchar_t*.
Таким образом, вы можете снова использовать многобайтовый набор символов, преобразовать строку или использовать Microsoft _wtoi() / _ttoi().

Чтобы облегчить переключение между наборами символов и придерживаться стиля книги, предпочтите версии _T* и _t*.

1 голос
/ 17 февраля 2010
  1. Объявление для fDebugSetProcessKillOnExit отсутствует; вероятно, это должно быть что-то вроде

DEBUGSETPROCESSKILLONEXIT fDebugSetProcessKillOnExit;

где DEBUGSETPROCESSKILLONEXIT должен быть typedef для прототипа этой функции.

  1. Вы компилируете в Unicode, и книга «думает», что вы компилируете в ANSI; Вы должны изменить строки, передаваемые API, на общие строки с помощью макроса _T ().

Итак, чтобы подвести итог, вы должны просто изменить одну строку и добавить typedef:

typedef BOOL (*DEBUGSETPROCESSKILLONEXIT)(BOOL);
//load the ptr to fDebugSetProcessKillOnExit
DEBUGSETPROCESSKILLONEXIT fDebugSetProcessKillOnExit = (DEBUGSETPROCESSKILLONEXIT) GetProcAddress(GetModuleHandle(_T("kernel32.dll")), _T("DebugSetProcessKillOnExit"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...