2012-06-13 142 views
0

我对C++颇为陌生,我试图在此论坛上了解代码http://www.blizzhackers.cc/viewtopic.php?p=2483118。我已经设法解决了大部分的错误,但是这个让我难住了这里的功能代码给我带来了问题。错误:从'int(*)()'无效转换为'long unsigned int'

void LoadDll(char *procName, char *dllName) 
{ 
    HMODULE hDll; 
    unsigned long cbtProcAddr; 

    hDll = LoadLibrary(dllName); 
    cbtProcAddr = GetProcAddress(hDll, "CBTProc"); // The error points to this line 

    SetWindowsHookEx(WH_CBT, cbtProcAddr, hDll, GetTargetThreadIdFromProcname(procName)); 
} 

回答

1

变化cbtProcAddr的定义:

HOOKPROC cbtProcAddr; 

编译器是不高兴,因为你想存储在宣布举办一个整数的变量的指针类型值。 (您可能需要将GetProcAddress()的结果转换为HOOKPROC,因为该函数不知道指向函数的实际签名,但SetWindowsHookEx()调用中指针的用法意味着它与该函数的签名兼容HOOKPROC函数指针类型。)

+0

错误:从 '诠释(*)()' 无效的转换 'LRESULT(*)(INT,WPARAM,LPARAM)' 这就是错误我现在得到的是来自不同的功能? – user1241223

+0

我认为这样做的通用方法(通过typedef)也值得一提,因为大多数函数签名都没有。 – chris

+0

好吧不好给一个尝试谢谢你的帮助 – user1241223

1

GetProcAddress返回FARPROC(其,看着编译器错误,仅仅是int(*)()一个typedef)。 unsigned long不是FARPROC,两者之间没有隐式转换。

我无法理解为什么要将GetProcAddress的结果存储在unsigned long中。如果你检索一个你想存储函数指针的函数。使用正确的类型(SetWindowsHookEx需要HOOKPROC)和流延:

HOOKPROC cbtProcAddr; 

hDll = LoadLibrary(dllName); 
cbtProcAddr = reinterpret_cast<HOOKPROC>(GetProcAddress(hDll, "CBTProc")); 
相关问题