2012-02-17 66 views
2

考虑下面的注册表导出:如何从注册表读取本地化名称?

Windows Registry Editor Version 5.00 

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\WinSock2\Parameters\Protocol_Catalog9\Catalog_Entries\000000000001] 
;... 
"ProtocolName"="@%SystemRoot%\\System32\\wshtcpip.dll,-60100" 

意图这里似乎是有人加载问题DLL,并使用某种形式的API的检索实际名称。但我不知道这是什么API:/

我想避免将DLL加载到我的地址空间(因此请致电DLL_PROCESS_ATTACH),如果可能的话;不能真正相信第三方DLL是值得信赖的。

回答

5

RegLoadMUIString将为您做必要的工作。但是,请注意,它是在Vista中引入的,所以如果你需要支持XP,它将无法帮助你。

如果您希望在提取资源时避免运行DLL中的代码,请使用LoadLibraryEx传递LOAD_LIBRARY_AS_IMAGE_RESOURCE | LOAD_LIBRARY_AS_DATAFILE或可能的LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE。完成之后,您可以拨打LoadString来提取MUI值。

+1

对于鲜为人知的LOAD_LIBRARY_AS_xxx标志为+1。 – 2012-02-17 08:51:15

1

这将帮助:如果需要

HMODULE hModule = LoadLibrary(_T("wshtcpip.dll")); // LoadLibraryEx is even better 
TCHAR pszValue[1024] = { 0 }; 
INT nResult = LoadString(hModule, 60100, pszValue, _countof(pszValue)); 

LoadString会从MUI下载资源的护理。 LoadString使用线程语言环境,您可能希望在调用之前覆盖它。

另请参阅:MSDN上的Loading Language Resources

+1

这将在'DllMain'中运行代码。 – 2012-02-17 08:18:38

+0

同意,'LoadLibraryEx'更准确。 – 2012-02-17 08:22:40