首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GetProcAddress为RegDeleteKeyEx返回NULL

GetProcAddress为RegDeleteKeyEx返回NULL
EN

Stack Overflow用户
提问于 2012-10-10 06:59:32
回答 2查看 1.1K关注 0票数 2

我试图实现32位和64位操作系统的注册表键的递归删除。由于RegDeleteKeyEx的定义不低于XP x64 Professional,所以我试图间接地使用该函数。

Problem::即使在x64上,也返回NULL。

代码语言:javascript
复制
//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") ;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-10 07:15:06

RegDeleteKeyEx实际上不是一个函数,而是一个宏。根据是否定义了UNICODE,宏扩展到实际函数名,该函数名在MSDN页面底部提供:

代码语言:javascript
复制
RegDeleteKeyExW (Unicode) and RegDeleteKeyExA (ANSI)

所以在你的情况下,你可能想要

代码语言:javascript
复制
#ifdef UNICODE
    const char RegDeleteKeyExSymbol[] = "RegDeleteKeyExW";
#else 
    const char RegDeleteKeyExSymbol[] = "RegDeleteKeyExA";
#endif

_RegDeleteKeyEx = (PFN_RegDeleteKeyEx)GetProcAddress( hAdvAPI32, RegDeleteKeyExSymbol );

这将使用适当的符号名,具体取决于编译自己的代码的方式(不管是否定义了UNICODE )。

票数 5
EN

Stack Overflow用户

发布于 2012-10-10 07:09:35

Windows导出接受或返回字符串的任何函数的两个版本:一个接受ANSI字符串,另一个接受Unicode字符串。ANSI版本的函数名称附加了一个A,而Unicode版本有一个W (用于“宽”字符串)。“旧新事物”( Thing )的文章更详细地解释了这一点。

因为RegDeleteKeyEx有一个字符串参数,所以您需要添加AW,这取决于您是要传递ANSI还是Unicode字符串,即您需要使用RegDeleteKeyExA还是RegDeleteKeyExW

此外,第三方DLL中的函数名通常根据调用约定以各种方式进行修饰。(但是,Windows系统DLL不使用名称修饰,因此这里不需要考虑这一点。)同样,旧的新事物有一个好解释

您可以使用Visual附带的GetProcAddress程序列出DLL的所有导出(这将显示您需要传递给GetProcAddress的实际函数名):

代码语言:javascript
复制
dumpbin /exports mydll.dll
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12813679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档