GetProcAddress 使用注意事项
Posted 人最大的荣耀不在于从未失败,而在于每次失败以后都能东山再起
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GetProcAddress 使用注意事项相关的知识,希望对你有一定的参考价值。
使用?GetProcAddress?Function?时,有以下几点需要特别留意:
1. 第二个参数类型是?LPCSTR,不是?;
2. 用?__declspec(dllexport),按?C?名称修饰(extern "C") 导出的函数名,对于?__stdcall?和?__fastcall?调用约定是相同的;对?__cdecl?是不同的(导出的函数名没有前面的下划线);
3. 即使返回值不是?NULL,也有可能发生错误。当 .def 模块不是连续地从 1 开始编号 ordinal 值,那么,如果用一个无函数对应的 ordinal 值调用?GetProcAddress,就会发生错误,返回一个无效的非?NULL?地址;?
4. 最好用函数名,而不是 ordinal 值调用?GetProcAddress,以避免不同版本 Dll 中某些函数不存在的情况。
注:确认 Dll 的导出函数名,可以用?DUMPBIN /EXPORTS dll_file_name.dll?命令,然后查看?name?列。
[cpp]?view plain?copy
- //?The?myPuts?function?writes?a?null-terminated?string?to??
- //?the?standard?output?device.??
- ??? ?
- //?The?export?mechanism?used?here?is?the?__declspec(export)??
- //?method?supported?by?Microsoft?Visual?Studio,?but?any??
- //?other?export?method?supported?by?your?development??
- //?environment?may?be?substituted.??
- ??? ?
- ??? ?
- #include?<windows.h>??
- ??? ?
- #define?EOF?(-1)??
- ??? ?
- #ifdef?__cplusplus????//?If?used?by?C++?code,???
- extern?"C"?{??????????//?we?need?to?export?the?C?interface??
- #endif??
- ??? ?
- __declspec(dllexport)?int?__cdecl?myPuts(LPTSTR?lpszMsg)?//?__cdecl?|?__stdcall?|?__fastcall??
- {??
- ????DWORD?cchWritten;??
- ????HANDLE?hStdout;??
- ????BOOL?fRet;??
- ??? ?
- ????//?Get?a?handle?to?the?standard?output?device.??
- ??? ?
- ????hStdout?=?GetStdHandle(STD_OUTPUT_HANDLE);??
- ????if?(INVALID_HANDLE_VALUE?==?hStdout)??
- ????????return?EOF;??
- ??? ?
- ????//?Write?a?null-terminated?string?to?the?standard?output?device.??
- ??? ?
- ????while?(*lpszMsg?!=?‘\0‘)??
- ????{??
- ????????fRet?=?WriteFile(hStdout,?lpszMsg,?1,?&cchWritten,?NULL);??
- ????????if(?(FALSE?==?fRet)?||?(1?!=?cchWritten)?)??
- ????????????return?EOF;??
- ????????lpszMsg++;??
- ????}??
- ??? ?
- ????return?1;??
- }??
- ??? ?
- #ifdef?__cplusplus??
- }??
- #endif??
[cpp]?view plain?copy
- //?A?simple?program?that?uses?LoadLibrary?and???
- //?GetProcAddress?to?access?myPuts?from?Myputs.dll.???
- ??? ?
- #include?<stdio.h>???
- #include?<windows.h>???
- ??? ?
- typedef?int?(__cdecl?*MYPROC)(LPTSTR);?//?__cdecl?|?__stdcall?|?__fastcall??
- ??? ?
- VOID?main(VOID)???
- {???
- ????HINSTANCE?hinstLib;???
- ????MYPROC?ProcAdd;???
- ????BOOL?fFreeResult,?fRunTimeLinkSuccess?=?FALSE;???
- ??? ?
- ????//?Get?a?handle?to?the?DLL?module.??
- ??? ?
- ????hinstLib?=?LoadLibrary(TEXT("bin\\Myputs"));?//?虽然?MSDN?Library?说这里如果??
- ?????????????????????????????????????????????????//?指定了路径,要用?backslashes?(\),??
- ?????????????????????????????????????????????????//?不要用?forward?slashes?(/),但??
- ?????????????????????????????????????????????????//?其实用二者都可以。??
- ?????????????????????????????????????????????????//?注:如果用?\,要用?\\。??
- ??? ?
- ????//?If?the?handle?is?valid,?try?to?get?the?function?address.??
- ??? ?
- ????if?(hinstLib?!=?NULL)???
- ????{???
- ????????ProcAdd?=?(MYPROC)GetProcAddress(hinstLib,?"myPuts");?//?__cdecl???:?myPuts??
- ??????????????????????????????????????????????????????????????//?__stdcall?:[email protected]??
- ??????????????????????????????????????????????????????????????//?__fastcall:[email protected]@4??
- ??? ?
- ????????//?If?the?function?address?is?valid,?call?the?function.??
- ??? ?
- ????????if?(NULL?!=?ProcAdd)???
- ????????{??
- ????????????fRunTimeLinkSuccess?=?TRUE;??
- ????????????(ProcAdd)?(TEXT("Message?via?DLL?function\n"));???
- ????????}??
- ??? ?
- ????????//?Free?the?DLL?module.??
- ??? ?
- ????????fFreeResult?=?FreeLibrary(hinstLib);???
- ????}???
- ??? ?
- ????//?If?unable?to?call?the?DLL?function,?use?an?alternative.??
- ??? ?
- ????if?(!?fRunTimeLinkSuccess)???
- ????????printf("Message?via?alternative?method\n");???
- }??
原文:http://blog.csdn.net/g5dsk/article/details/6680698
以上是关于GetProcAddress 使用注意事项的主要内容,如果未能解决你的问题,请参考以下文章
我应该使用 GetProcAddress 还是只包含各种 win32 库?
GetProcAddress() 为 .NET DLL 返回 Nil
即使使用 LoadLibrary 和 GetProcAddress,ChoosePixelFormat 也会崩溃