2

WinAPI 関数を使用しようとしていますGUIDFromString()が、それをプロジェクトに含めるにはいくつかの仕上げが必要です。

msdnのドキュメントによると:

この関数は、ヘッダーで宣言されていないか、.dll ファイルから名前でエクスポートされていません。これは、GUIDFromStringA の序数 703 および GUIDFromStringW の序数 704 として Shell32.dll からロードする必要があります。

また、GUIDFromStringA の序数 269 および GUIDFromStringW の序数 270 として Shlwapi.dll からアクセスすることもできます。

以前に 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?
4

3 に答える 3

6

のドキュメントを読むと、次のように書かれGUIDFromString()ています。

GUIDFromString は、Windows XP Service Pack 2 (SP2) または Windows Vista で利用できます。以降のバージョンでは変更されたり、使用できなくなったりする可能性があります。アプリケーションは、この関数の代わりに CLSIDFromString または IIDFromString を使用する必要があります。

CLSIDFromString()IIDFromString()は両方とも Ole32.dll から名前でエクスポートされるため、他の DLL 関数と同じように使用できます。

そうは言っても、それでも使用したい場合はGUIDFromString()、使用LoadLibrary()して shell32.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;
}
于 2013-01-28T09:00:48.387 に答える
0

これにより、「構文エラー '('」というエラーが発生します。

typedef BOOL WINAPI (*LPFN_GUIDFromString)(LPCTSTR, LPGUID);

適切なバージョンは次のとおりです。

typedef BOOL (WINAPI *LPFN_GUIDFromString)(LPCTSTR, LPGUID);
于 2013-02-21T12:49:52.723 に答える