如何成功将MYPROC函数指针与GetProcAddress返回的FARPROC转换?
如何将FARPROC转换为带参数的函数指针类型?
要把GetProcAddress返回的FARPROC(无参数通用函数指针)转换为你定义的MYPROC(带LPCWSTR参数的函数指针),直接用显式强制类型转换即可,这是Windows平台动态链接函数时的标准操作。
核心逻辑
FARPROC只是Windows SDK定义的通用函数指针占位类型,用来承接任意函数的地址。当你明确知道DLL导出的myPuts函数签名和MYPROC完全匹配时,直接强制转换类型就可以安全调用该函数。
完整示例代码
typedef void(*MYPROC)(LPCWSTR); // 定义匹配DLL函数签名的函数指针类型 int main(void) { HINSTANCE getdll; MYPROC getprocadd; BOOL fFreeResult, fRunTimeLinkSuccess = FALSE; getdll = LoadLibrary(TEXT("myPuts.dll")); // 获取DLL模块句柄 if (getdll == NULL) { exit(2); } if (getdll != NULL) // 句柄有效时尝试获取函数地址 { // 直接将FARPROC强制转换为MYPROC类型 getprocadd = (MYPROC)GetProcAddress(getdll, "myPuts"); if (NULL != getprocadd) // 获取到函数地址后调用 { fRunTimeLinkSuccess = TRUE; (getprocadd)(L"Message from the .dll file's function: myPuts\n"); } fFreeResult = FreeLibrary(getdll); // 释放DLL模块 } // 调用失败时使用替代方案 if (!fRunTimeLinkSuccess) printf("Message printed from executable: printf\n"); return 0; }
关键注意事项
- 签名必须严格匹配:DLL中的
myPuts函数必须和MYPROC定义的签名完全一致——包括参数类型、参数数量、返回值类型,以及调用约定(如果DLL函数用了WINAPI/stdcall,你的函数指针定义也要加上,比如typedef void(WINAPI *MYPROC)(LPCWSTR);),否则调用时会引发栈损坏、程序崩溃等未定义行为。 - 这种强制转换是Windows平台下的常规操作,编译器可能会给出类型不匹配的警告,但只要你确认签名一致,就可以忽略或通过编译选项抑制警告。
内容的提问来源于stack exchange,提问作者manul4pow
相关产品推荐
相关产品推荐

