C++ 使用包括Shell32.dll在内的GUIDFromString请求:如何做到这一点
我正试图使用WinAPI函数C++ 使用包括Shell32.dll在内的GUIDFromString请求:如何做到这一点,c++,winapi,dll,C++,Winapi,Dll,我正试图使用WinAPI函数GUIDFromString(),但它需要一些欺骗才能将其包含在我的项目中 根据文件: 此函数不在标头中声明,也不按名称从 .dll文件。它必须作为序号703从Shell32.dll加载,以便 GUIDFromStringA和GUIDFromStringW的序号704 也可以从Shlwapi.dll中以序号269的形式访问 GUIDFromStringA和GUIDFromStringW的序号270 我以前从未加载过DLL,因此我不确定应该做什么,也不确定加载DLL是否
GUIDFromString()
,但它需要一些欺骗才能将其包含在我的项目中
根据文件:
此函数不在标头中声明,也不按名称从
.dll文件。它必须作为序号703从Shell32.dll加载,以便
GUIDFromStringA和GUIDFromStringW的序号704
也可以从Shlwapi.dll中以序号269的形式访问
GUIDFromStringA和GUIDFromStringW的序号270
我以前从未加载过DLL,因此我不确定应该做什么,也不确定加载DLL是否足够,是否还必须包含编号为703的“序号”?是否有人能够提供任何建议,我需要做什么来使用这个功能,甚至是一个例子
我下面的尝试无效(我正在使用VC++2010 Express):
如果为GUIDFromString()
,它会显示:
GUIDFromString可通过带有Service Pack 2(SP2)的Windows XP或Windows Vista获得。它可能在后续版本中被更改或不可用。应用程序应使用CLSIDFromString或IIDFromString代替此函数
和都是从Ole32.dll按名称导出的,因此您可以像使用任何其他dll函数一样使用它们
话虽如此,如果仍要使用GUIDFromString()
,请使用加载shell32.dll,然后使用访问函数。演示如何做到这一点。要按顺序加载函数,可以在调用GetProcAddress()
时使用宏
例如:
// MAKEINTRESOURCE() returns an LPTSTR, but GetProcAddress()
// expects LPSTR even in UNICODE, so using MAKEINTRESOURCEA()...
#ifdef UNICODE
#define MAKEINTRESOURCEA_T(a, u) MAKEINTRESOURCEA(u)
#else
#define MAKEINTRESOURCEA_T(a, u) MAKEINTRESOURCEA(a)
#endif
BOOL myGUIDFromString(LPCTSTR psz, LPGUID pguid)
{
BOOL bRet = FALSE;
typedef BOOL (WINAPI *LPFN_GUIDFromString)(LPCTSTR, LPGUID);
LPFN_GUIDFromString pGUIDFromString = NULL;
HINSTANCE hInst = LoadLibrary(TEXT("shell32.dll"));
if (hInst)
{
pGUIDFromString = (LPFN_GUIDFromString) GetProcAddress(hInst, MAKEINTRESOURCEA_T(703, 704));
if (pGUIDFromString)
bRet = pGUIDFromString(psz, pguid);
FreeLibrary(hInst);
}
if (!pGUIDFromString)
{
hInst = LoadLibrary(TEXT("Shlwapi.dll"));
if (hInst)
{
pGUIDFromString = (LPFN_GUIDFromString) GetProcAddress(hInst, MAKEINTRESOURCEA_T(269, 270));
if (pGUIDFromString)
bRet = pGUIDFromString(psz, pguid);
FreeLibrary(hInst);
}
}
return bRet;
}
这会给您一个错误“语法错误”(“):
正确的版本是:
typedef BOOL (WINAPI *LPFN_GUIDFromString)(LPCTSTR, LPGUID);
将以下行另存为SHLWAPIX.DEF:
LIBRARY SHLWAPI
VERSION 6.0
EXPORTS
GUIDFromStringA @269
GUIDFromStringW @270
将以下行另存为SHLWAPIX.C:
// https://msdn.microsoft.com/en-us/library/bb776431.aspx
__declspec(dllexport)
int __stdcall GUIDFromStringA(void *_1, void *_2)
{ return 0; }
__declspec(dllexport)
int __stdcall GUIDFromStringW(void *_1, void *_2)
{ return 0; }
#pragma comment(lib, "SHLWAPIX.LIB")
#pragma comment(lib, "USER32.LIB")
#pragma comment(linker, "/ENTRY:wWinMainCRTStartup")
#pragma comment(linker, "/SUBSYSTEM:WINDOWS,5.0")
#pragma comment(linker, "/VERSION:1.0")
#define STRICT
#define UNICODE
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include "shlwapix.h"
VOID wWinMainCRTStartup()
{
GUID guid = {0};
WCHAR szBuffer[1025] = L"";
if (GUIDFromStringA("{00112233-4455-6677-8899-AABBCCDDEEFF}", &guid))
if (wsprintf(szBuffer, L"GUID = {%08lX-%04hX-%04hX-%02X%02X-%02X%02X%02X%02X%02X%02X}\n",`
guid.Data1, guid.Data2, guid.Data3, guid.Data4[0], guid.Data4[1], guid.Data4[2], guid.Data4[3], guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]) > 0)
MessageBox((HWND) NULL, szBuffer, L"GUIDFromStringA()", MB_OK);
if (GUIDFromStringW(L"{FFEEDDCC-BBAA-9988-7766-554433221100}", &guid))
if (wsprintf(szBuffer, L"GUID = {%08lX-%04hX-%04hX-%02X%02X-%02X%02X%02X%02X%02X%02X}\n",
guid.Data1, guid.Data2, guid.Data3, guid.Data4[0], guid.Data4[1], guid.Data4[2], guid.Data4[3], guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]) > 0)
MessageBox((HWND) NULL, szBuffer, L"GUIDFromStringW()", MB_OK);
}
跑
CL.EXE/LD/Zl SHLWAPIX.C/link/DEF:SHLWAPIX.DEF/NOENTRY
要创建导入库SHLWAPIX.LIB,请删除SHLWAPIX.OBJ、SHLWAPIX.EXP和SHLWAPIX.DLL
将以下行另存为SHLWAPIX.H:
#pragma once
#pragma comment(linker, "/DEFAULTLIB:SHLWAPIX.LIB")
__declspec(dllimport)
BOOL WINAPI GUIDFromStringA(LPCSTR psz, LPGUID pguid);
__declspec(dllimport)
BOOL WINAPI GUIDFromStringW(LPCWSTR psz, LPGUID pguid);
最后将以下行保存为SHLWAPIX.C:
// https://msdn.microsoft.com/en-us/library/bb776431.aspx
__declspec(dllexport)
int __stdcall GUIDFromStringA(void *_1, void *_2)
{ return 0; }
__declspec(dllexport)
int __stdcall GUIDFromStringW(void *_1, void *_2)
{ return 0; }
#pragma comment(lib, "SHLWAPIX.LIB")
#pragma comment(lib, "USER32.LIB")
#pragma comment(linker, "/ENTRY:wWinMainCRTStartup")
#pragma comment(linker, "/SUBSYSTEM:WINDOWS,5.0")
#pragma comment(linker, "/VERSION:1.0")
#define STRICT
#define UNICODE
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include "shlwapix.h"
VOID wWinMainCRTStartup()
{
GUID guid = {0};
WCHAR szBuffer[1025] = L"";
if (GUIDFromStringA("{00112233-4455-6677-8899-AABBCCDDEEFF}", &guid))
if (wsprintf(szBuffer, L"GUID = {%08lX-%04hX-%04hX-%02X%02X-%02X%02X%02X%02X%02X%02X}\n",`
guid.Data1, guid.Data2, guid.Data3, guid.Data4[0], guid.Data4[1], guid.Data4[2], guid.Data4[3], guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]) > 0)
MessageBox((HWND) NULL, szBuffer, L"GUIDFromStringA()", MB_OK);
if (GUIDFromStringW(L"{FFEEDDCC-BBAA-9988-7766-554433221100}", &guid))
if (wsprintf(szBuffer, L"GUID = {%08lX-%04hX-%04hX-%02X%02X-%02X%02X%02X%02X%02X%02X}\n",
guid.Data1, guid.Data2, guid.Data3, guid.Data4[0], guid.Data4[1], guid.Data4[2], guid.Data4[3], guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]) > 0)
MessageBox((HWND) NULL, szBuffer, L"GUIDFromStringW()", MB_OK);
}
#pragma注释(lib,“SHLWAPIX.lib”)
#pragma注释(lib,“USER32.lib”)
#pragma注释(链接器,“/ENTRY:wwinmincartstartup”)
#pragma注释(链接器,“/SUBSYSTEM:WINDOWS,5.0”)
#pragma注释(链接器,“/VERSION:1.0”)
#定义严格
#定义UNICODE
#定义WIN32_精益_和_平均值
#包括
#包括“shlwapix.h”
VOID wwinmincartstartup()
{
GUID={0};
WCHAR szBuffer[1025]=L”“;
if(GUIDFromStringA({00112233-4455-6677-8899-AABBCCDDEEFF},&guid))
如果(wsprintf(szBuffer,L“GUID={%08lX-%04hX-%04hX-%02X%02X-%02X%02X%02X}\n”`
guid.Data1,guid.Data2,guid.Data3,guid.Data4[0],guid.Data4[1],guid.Data4[2],guid.Data4[3],guid.Data4[4],guid.Data4[5],guid.Data4[6],guid.Data4[7])>0)
MessageBox((HWND)NULL,szBuffer,L“GUIDFromStringA()”,MB_OK);
if(GUIDFromStringW(L“{ffeedcc-BBAA-9988-7766-554433221100},&guid))
如果(wsprintf(szBuffer,L“GUID={%08lX-%04hX-%04hX-%02X%02X-%02X%02X%02X}\n”,
guid.Data1,guid.Data2,guid.Data3,guid.Data4[0],guid.Data4[1],guid.Data4[2],guid.Data4[3],guid.Data4[4],guid.Data4[5],guid.Data4[6],guid.Data4[7])>0)
MessageBox((HWND)NULL,szBuffer,L“GUIDFromStringW()”,MB_OK);
}
最后运行
CL.EXE/GS-SHLWAPIX.C
创建SHLWAPIX.EXE,然后运行后者。我没有用序数代替名称进行排序,但我猜您在GetProcAddress
中指定了“703”
作为名称。您还可以使用UuidFromString
函数,该函数按名称导出()@克里斯:使用MAKEINTRESOURCE()
将序号传递给GetProcAddress()
@RemyLebeau,哦,我明白了。有一天知道会很好,谢谢。好奇的是,你是否提前知道GUID(而这是你在运行时发现的字符串?)-如果是这样,你可以跳过字符串解析,并在编译时将其声明为GUID myGuid={0x00000000,0x0000,0x0000,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}
或类似内容。一个答案不是评论另一个答案的合适区域,但无论如何……它是有用的。