将void指针(数据)转换为函数指针

Jes*_*ica 6 c windows pointers

我知道之前有人问过,但我在这里看到的情况都不像这个.我在运行时导入一些API函数,这些函数的一般声明如下:

// Masks for UnmapViewOfFile and MapViewOfFile
typedef BOOL (WINAPI *MyUnmapViewOfFile)(LPCVOID);
typedef LPVOID (WINAPI *MyMapViewOfFile)(HANDLE, DWORD, DWORD, DWORD, SIZE_T);

// Declarations
MyUnmapViewOfFile LoadedUnmapViewOfFile;
MyMapViewOfFile LoadedMapViewOfFile;
Run Code Online (Sandbox Code Playgroud)

然后我调用一个通用的"加载"函数,它调用GetProcAddress以从正确的DLL获取导出函数的地址.该地址以无效**返回.此void**是泛型加载中的参数之一,如:

int GenericLoad(char* lib, void** Address, char* TheFunctionToLoad)
Run Code Online (Sandbox Code Playgroud)

我会称之为这个功能:

void *Address;
GenericLoad("kernel32.dll", &Address, "UnmapViewOfFile");
LoadedUnmapViewOfFile = (MyUnmapViewOfFile) Address;
Run Code Online (Sandbox Code Playgroud)

或类似的东西.现在,编译器当然抱怨尝试将数据void*转换为函数指针.那怎么办?

我已经阅读了无数的网站和各种令人讨厌的演员阵容,所以如果你在解释中添加代码,我会很感激.

谢谢Jess

Pav*_*sky 3

正确的代码是这一行:

GenericLoad("kernel32.dll", (void**)&LoadedUnmapViewOfFile, "UnmapViewOfFile");
Run Code Online (Sandbox Code Playgroud)

这里所做的基本上是这样的:指针变量的地址(您想要在其中放置函数地址的变量)被传递给 GenericLoad - 这基本上就是它所期望的。void** 表示“给我你的指针的地址”。所有的类型转换都是围绕着它的魔法。C 不允许指定“指向任何函数指针的指针”,因此 API 作者首选 void**。