C++ 使用包括Shell32.dll在内的GUIDFromString请求:如何做到这一点

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是否

我正试图使用WinAPI函数
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}
或类似内容。一个答案不是评论另一个答案的合适区域,但无论如何……它是有用的。