我正在尝试使用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?发布于 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()宏。
因此,例如:
// 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;
}发布于 2016-11-12 15:32:35
将下列行保存为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; }运行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:
#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,然后运行后者。
发布于 2013-02-21 12:49:52
这将给出一个错误“语法错误”(‘“):
typedef BOOL WINAPI (*LPFN_GUIDFromString)(LPCTSTR, LPGUID);适当的版本是:
typedef BOOL (WINAPI *LPFN_GUIDFromString)(LPCTSTR, LPGUID);https://stackoverflow.com/questions/14555591
复制相似问题