我试图实现32位和64位操作系统的注册表键的递归删除。由于RegDeleteKeyEx的定义不低于XP x64 Professional,所以我试图间接地使用该函数。
Problem::即使在x64上,也返回NULL。
//Global Declarations
typedef LONG (WINAPI * PFN_RegDeleteKeyEx)(HKEY hKey , LPCTSTR lpSubKey , REGSAM samDesired , DWORD Reserved );
PFN_RegDeleteKeyEx _RegDeleteKeyEx ;
//The code inside function
hAdvAPI32 = LoadLibrary(TEXT("Advapi32.dll"));
_RegDeleteKeyEx = (PFN_RegDeleteKeyEx)GetProcAddress( hAdvAPI32, "RegDeleteKeyEx" );
if( _RegDeleteKeyEx == NULL )
printf("NULL\n") ;发布于 2012-10-10 07:15:06
RegDeleteKeyEx实际上不是一个函数,而是一个宏。根据是否定义了UNICODE,宏扩展到实际函数名,该函数名在MSDN页面底部提供:
RegDeleteKeyExW (Unicode) and RegDeleteKeyExA (ANSI)所以在你的情况下,你可能想要
#ifdef UNICODE
const char RegDeleteKeyExSymbol[] = "RegDeleteKeyExW";
#else
const char RegDeleteKeyExSymbol[] = "RegDeleteKeyExA";
#endif
_RegDeleteKeyEx = (PFN_RegDeleteKeyEx)GetProcAddress( hAdvAPI32, RegDeleteKeyExSymbol );这将使用适当的符号名,具体取决于编译自己的代码的方式(不管是否定义了UNICODE )。
发布于 2012-10-10 07:09:35
Windows导出接受或返回字符串的任何函数的两个版本:一个接受ANSI字符串,另一个接受Unicode字符串。ANSI版本的函数名称附加了一个A,而Unicode版本有一个W (用于“宽”字符串)。“旧新事物”( Thing )的文章更详细地解释了这一点。
因为RegDeleteKeyEx有一个字符串参数,所以您需要添加A或W,这取决于您是要传递ANSI还是Unicode字符串,即您需要使用RegDeleteKeyExA还是RegDeleteKeyExW。
此外,第三方DLL中的函数名通常根据调用约定以各种方式进行修饰。(但是,Windows系统DLL不使用名称修饰,因此这里不需要考虑这一点。)同样,旧的新事物有一个好解释。
您可以使用Visual附带的GetProcAddress程序列出DLL的所有导出(这将显示您需要传递给GetProcAddress的实际函数名):
dumpbin /exports mydll.dllhttps://stackoverflow.com/questions/12813679
复制相似问题