使用 GUIDFromString 要求(包括 Shell32.dll:我该怎么做
Using GUIDFromString requries including Shell32.dll: How do I do that
我正在尝试使用WinAPI函数GUIDFromString()
但它需要一些微调才能将其包含在我的项目中。
根据 msdn 文档:
我此函数不会在标头中声明,也不会按名称从 .dll文件。它必须从 Shell32 加载.dll作为序号 703 GUIDFromStringA 和序号 704 表示 GUIDFromStringW。
它也可以从 Shlwapi 访问.dll作为序数 269 为 GUIDFromStringA 和序号 270 表示 GUIDFromStringW。
以前从未加载过 DLL,所以我不确定我应该做什么,我不确定加载 DLL 是否足够,我是否还必须包含带有数字 703 的"序号"?有人能就我需要做什么来使用此功能甚至示例提供任何建议吗?
我在下面的尝试不起作用(我正在使用VC++ 2010 Express):
#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?
如果您阅读 GUIDFromString()
的文档,它说:
GUIDFromString 可通过 Windows XP Service Pack 2 (SP2) 或 Windows Vista 获得。它可能在后续版本中被更改或不可用。应用程序应使用 CLSIDFromString 或 IIDFromString 代替此函数。
CLSIDFromString()
和 IIDFromString()
都是按名称从 Ole32.dll 导出的,因此您可以像使用任何其他 DLL 函数一样使用它们。
话虽如此,如果您仍然想使用 GUIDFromString()
那么使用 LoadLibrary()
加载 shell32.dll然后使用 GetProcAddress()
访问该函数。 MSDN 文档演示了如何执行此操作。 要按序号加载函数,可以在调用 GetProcAddress()
时使用 MAKEINTRESOURCE()
宏。
因此,例如:
// 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;
}
将以下行另存为 SHLWAPIX。定义:
LIBRARY SHLWAPI
VERSION 6.0
EXPORTS
GUIDFromStringA @269
GUIDFromStringW @270
将以下行另存为 SHLWAPIX。三:
// 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:
#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。三:
#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,然后运行后者。
这给你一个错误"语法错误'('":
typedef BOOL WINAPI (*LPFN_GUIDFromString)(LPCTSTR, LPGUID);
正确的版本是:
typedef BOOL (WINAPI *LPFN_GUIDFromString)(LPCTSTR, LPGUID);
- 我该怎么做才能摆脱使用命名空间时的语法错误?
- 模板类是这里的最佳选择吗?如果是,我该怎么做?
- 在C++中,创建'n'数量的对象的推荐方法是什么,其中n是用户定义的。我该怎么做?
- 我必须输入我的名字才能输入我的资源,我该怎么做
- swig-包装到c#时,没有默认的std ::列表,我该怎么做
- C ++ 12位变量,我该怎么做?
- 在使用 emscripten 编译时,我该怎么做才能包含 <X11/Xlocale.h>?
- 我该怎么做 - 就像一个速度 的功率快速的功率一样快速的两个功率
- 错误:不允许指向不完整类类型的指针.我该怎么做
- 我该怎么做 throw 来处理 C++ 中的错误数据类型
- 正在尝试初始化区域结构内的边缘结构.我该怎么做
- 我想在我的main中为下面的代码创建一个对象..那么我该怎么做呢
- 我该怎么做才能不使用!openFile.eof()
- 这是对reinterpret_cast的合法使用吗?如果不是,我该怎么做
- 我把矢量从一个文本文件中归档,它不会变成一行.我该怎么做
- 我该怎么做才能在 eclipse 中设置C++开发
- C ++ win 32,我想将项目列表添加到组合框中.我该怎么做
- 我有一个类来表示整数,我想区分磅和公斤,我该怎么做
- 如果我只想在模板中专门研究一种方法,我该怎么做
- 使用 GUIDFromString 要求(包括 Shell32.dll:我该怎么做