2009-12-10 62 views
0

我从库Advapi32.dll动态加载多个注册表API。在Windows XP和Vista下,一切正常。在Windows 7下,我不断收到错误该参数不正确,在某些情况下(如RegCloseKey)我的应用程序崩溃。在Windows 7上动态加载注册表功能?

我使用的代码是通常的:

// RegCreateKeyEx 
typedef LONG (WINAPI *MyRegCreateKeyEx)(HKEY, LPCTSTR, DWORD, LPTSTR, DWORD, REGSAM, LPSECURITY_ATTRIBUTES, PHKEY, LPDWORD); 
MyRegCreateKeyEx LoadedRegCreateKeyEx; 

然后我用LoadLibrary加载Advapi.dll和GetProcAddress找到地址RegCreateKeyEx。像:

LoadedRegCreateKeyEx = (MyRegCreateKeyEx)GetProcAddress(LibHandle, "RegCreateKeyEx"); 

一切返回OK,没有任何错误和指针似乎是正确的,但它不能在Windows 7 任何想法下工作吗?有什么改变吗?有没有不同的方式来为Windows 7做到这一点?

谢谢 jess。

编辑:这似乎是这个问题扩展到所有类型的API在Windows 7上。任何想法?

+0

你在Windows 7 ** x64 **上试试吗? – SLaks 2009-12-10 20:47:33

+0

x86和x64。在这两种情况下都是一样 – Jessica 2009-12-10 20:48:27

+0

当你直接调用RegCreateKeyEx而不是动态加载的时,你会得到同样的问题吗? – karoberts 2009-12-10 20:57:00

回答

1

问题是从库中获得正确的偏移量。一旦我得到它一切正常

2

当您拨打GetProcAddress时,您可能需要指定正确的版本,即A代表ANSI,W代表UNICODE。

+0

谢谢。我正在导入RegCreateKeyExA。但是如果我用相同的参数静态调用RegCreateKeyExA,那么返回一个错误“invalid parameter”,那么它工作正常 – Jessica 2009-12-11 14:07:32

+0

只是为了尝试我输入的Unicode版本,我得到了一个完全不同的错误:错误18(ERROR_NO_MORE_FILES)。我感到困惑。 – Jessica 2009-12-11 14:45:16

+0

看来,如果导入unicode版本,它在x64上运行32位二进制文​​件并在x64上运行64位二进制文​​件时有效,但在W64中运行32位二进制文​​件时(在x64 Windows上运行32位二进制文​​件时)不起作用。想法? – Jessica 2009-12-11 16:05:42