首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用GUIDFromString命令,包括Shell32.dll:如何做到这一点

使用GUIDFromString命令,包括Shell32.dll:如何做到这一点
EN

Stack Overflow用户
提问于 2013-01-28 04:46:55
回答 3查看 4.1K关注 0票数 2

我正在尝试使用WinAPI函数GUIDFromString(),但它需要一些技巧才能将其包含到我的项目中。

根据msdn文档:

此函数不会在头文件中声明,也不会从.dll文件中按名称导出。它必须从Shell32.dll加载为序号703用于GUIDFromStringA,序号为704用于GUIDFromStringW。 它还可以从Shlwapi.dll访问,序号269用于GUIDFromStringA,序号为270用于GUIDFromStringW。

我以前从来没有加载过DLL,所以我不确定我应该做什么,我也不确定加载DLL是否足够,我是否也必须包含一个数字703的序号?有人能就我需要做些什么来使用这个功能,甚至是一个例子,提供任何建议吗?

下面的尝试不起作用(我正在使用VC++ 2010 Express):

代码语言:javascript
复制
#pragma comment(lib, "shell32.lib") // if I am including the dll do I need to include the lib aswell?

// I've heard that the dll location differs across versions of windows
// Does anyone know of a Cross-Windows-Version way to include Shell32.dll no matter where it is? Maybe use a keyword like "%SYSTEM%/Shell32.dll"
HINSTANCE shell32DLL = LoadLibary("C:/System/Shell32.dll"); 

// Now do I include 'Ordinal 703' as described in msdn? And how do I do that?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-28 09:00:48

如果您使用阅读文件 for GUIDFromString(),它会说:

GUIDFromString可通过Windows和Service 2 (SP2)或Windows获得。它可能在后续版本中被更改或不可用。应用程序应该使用CLSIDFromString或IIDFromString来代替这个函数。

CLSIDFromString()IIDFromString()都是从Ole32.dll导出的,因此您可以像使用任何其他DLL函数一样使用它们。

尽管如此,如果您仍然希望使用GUIDFromString(),那么使用LoadLibrary()加载still 32.dll,然后使用GetProcAddress()访问函数。MSDN文档演示了如何做到这一点。若要按序号加载函数,可以在调用MAKEINTRESOURCE()宏时使用GetProcAddress()宏。

因此,例如:

代码语言:javascript
复制
// 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;
}
票数 6
EN

Stack Overflow用户

发布于 2016-11-12 15:32:35

将下列行保存为SHLWAPIX.DEF:

代码语言:javascript
复制
LIBRARY SHLWAPI
VERSION 6.0
EXPORTS
 GUIDFromStringA @269
 GUIDFromStringW @270

将下列行保存为SHLWAPIX.C:

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

运行CL.EXE /LD /Zl SHLWAPIX.C /link /DEF:SHLWAPIX.DEF /NOENTRY创建导入库SHLWAPIX.LIB,然后删除SHLWAPIX.OBJ、SHLWAPIX.EXP和SHLWAPIX.DLL

将下列行保存为SHLWAPIX.H:

代码语言:javascript
复制
#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:

代码语言:javascript
复制
#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 /GS- SHLWAPIX.C来创建SHLWAPIX.EXE,然后运行后者。

票数 1
EN

Stack Overflow用户

发布于 2013-02-21 12:49:52

这将给出一个错误“语法错误”(‘“):

代码语言:javascript
复制
typedef BOOL WINAPI (*LPFN_GUIDFromString)(LPCTSTR, LPGUID);

适当的版本是:

代码语言:javascript
复制
typedef BOOL (WINAPI *LPFN_GUIDFromString)(LPCTSTR, LPGUID);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14555591

复制
相关文章

相似问题

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