SxsLookupClrGuid 函式
擷取與元件資訊清單中指定 GUID 相關聯的類別名稱和其他資訊。 只有在實作.NET Framework中的低階 Managed-Unmanaged 互通性時,才會使用此函式。 For more information about managed-unmanaged interoperability, see "Interoperating with Unmanaged Code" in the .NET Framework SDK and also Isolated Applications and Side-by-side Assemblies.
語法
BOOL SxsLookupClrGuid(
_In_ DWORD dwFlags,
_In_ LPGUID pClsid,
_In_opt_ HANDLE hActCtx,
_Inout_opt_ PVOID pvOutputBuffer,
_In_ SIZE_T cbOutputBuffer,
_Out_ PSIZE_T pcbOutputBuffer
);
參數
-
dwFlags [in]
-
下列旗標的零或多個組合。
值 意義 - SXS_LOOKUP_CLR_GUID_USE_ACTCTX
- 0x00000001
如果設定此旗標, 則 hActCtx 參數必須包含 CreateActCtx 函式所傳回的啟用內容控制碼。 如果未設定此旗標,則會忽略 hActCtx 參數, 而 SxsLookupClrGuid 會搜尋目前作用中的啟用內容, (ActivateActCtx 函式用來啟用內容) 。 - SXS_LOOKUP_CLR_GUID_FIND_SURROGATE
- 0x00010000
如果設定此旗標, SxsLookupClrGuid 會搜尋 Surrogate。 - SXS_LOOKUP_CLR_GUID_FIND_CLR_CLASS
- 0x00020000
如果設定此旗標, SxsLookupClrGuid 會搜尋類別。 - SXS_LOOKUP_CLR_GUID_FIND_ANY
- 0x00030000
這是 SXS_LOOKUP_CLR_GUID_FIND_SURROGATE 和 SXS_LOOKUP_CLR_GUID_FIND_CLR_CLASS 旗標的組合;如果兩者都已設定, 則 SxsLookupClrGuid 會先搜尋 Surrogate,而且只有在找不到代理時,才會搜尋類別。 -
pClsid [in]
-
要搜尋啟用內容以取得交互操作資訊之 GUID 的指標。 此參數不可為 Null。
-
hActCtx [in, 選擇性]
-
如果在dwFlags參數中設定SXS_LOOKUP_CLR_GUID_USE_ACTCTX旗標,則 hActCtx 必須包含 CreateActCtx函式所傳回的啟用內容控制碼。 否則會忽略 hActCtx 。
-
pvOutputBuffer [in, out, optional]
-
將傳回信息複製到其中之緩衝區的指標。 只有當 cbOutputBuffer 參數為零值時,這個參數才可為 Null 值。 如果有任何) 包含 SXS_GUID_INFORMATION_CLR 結構,後面接著任何其他字串資料,則在此緩衝區中放置的資料 (。 如需詳細資訊,請參閱下面的一節。
-
cbOutputBuffer [in]
-
以位元組為單位的緩衝區大小, 由 pvOutputBuffer 參數所指向。
-
spOutputBuffer [out]
-
變數的指標,其中傳回信息的大小以位元組為單位,置於結束時。 如果 cbOutputBuffer 參數為零,或輸出緩衝區的大小小於傳回信息的大小, 則 SxsLookupClrGuid 會失敗,而 GetLastError 會傳回 ERROR_INSUFFICIENT_BUFFER的錯誤。 在此情況下,請使用 由 sqlOutputBuffer 指向的變數中的值來配置夠大的緩衝區,然後再次呼叫 SxsLookupClrGuid 以擷取所需的資訊。
傳回值
如果成功,則傳回 TRUE ,否則傳回 FALSE 。 如需詳細資訊,請呼叫GetLastError
備註
此函式沒有相關聯的匯入程式庫或標頭檔;您必須使用 LoadLibrary 和 GetProcAddress 函式來呼叫它。
Managed 元件可能會將自己宣告為支援的 Managed「Interop 元件」,以便允許 Unmanaged Win32 元件取用者參考宣告元件。 元件取用者可以在 GUID 上呼叫 CoCreateInstance 來與受控元件互動。 交互操作層會將物件建立要求路由傳送至.NET Framework、建立 Managed 物件的實例,並傳回介面指標。
SxsLookupClrGuid可讓架構擷取元件資訊清單中與指定 GUID 相關聯的資訊,例如其 .NET 類別名稱是什麼、其所需的.NET Framework版本,以及它所在的主機元件。 Managed 元件會發佈 Interop 元件,其中包含一些語句與元件和類型名稱建立關聯的語句,而 .NET 執行時間會在呼叫 CoCreateInstance 時代理建構 Managed 物件實例。
以下是宣告 CLR GUID 的範例元件資訊清單,以及 SxsLookupClrGuid 可以查閱的 CLR Surrogate:
<assembly manifestVersion="1.0" xmlns=
"urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity type="interop" name=
"DotNet.Sample.Surrogates" version="1.0.0.0"/>
<clrClass name="MySampleClass" clsid=
"{19f7f420-4cc5-4b0d-8a82-c24645c0ba1f}"
progId="MySampleClass.1" runtimeVersion="1.0.3055"/>
<clrSurrogate name="MySampleSurrogate" clsid=
"{fdb46ca5-9477-4528-b4b2-7f00a254cdea}"
runtimeVersion="1.0.3055"/>
</assembly>
互通性提供者會使用 GUID 「{fdb46ca5-9477-4528-b4b2-7f00a254cdea}」 的指標來呼叫 SxsLookupClrGuid 「, 和 會以 傳回類別名稱 」MySampleSurrogate「、裝載元件所需的執行時間版本 」1.0.3055「 和文字身分識別 」DotNet.Sample.Surrogates,version='1.0.0.0',type='interop'」。
此傳回信息會由 宣告如下的SXS_GUID_INFORMATION_CLR 結構所包含和/或參考。
typedef struct _SXS_GUID_INFORMATION_CLR
{
DWORD cbSize;
DWORD dwFlags;
PCWSTR pcwszRuntimeVersion;
PCWSTR pcwszTypeName;
PCWSTR pcwszAssemblyIdentity;
} SXS_GUID_INFORMATION_CLR, *PSXS_GUID_INFORMATION_CLR;
typedef const SXS_GUID_INFORMATION_CLR *PCSXS_GUID_INFORMATION_CLR;
這個結構的成員包含下列資訊。
member | 描述 |
---|---|
cbSize |
包含SXS_GUID_INFORMATION_CLR結構的大小, (這可讓結構在更新版本中成長) 。 |
dwFlags |
包含下列兩個旗標值的其中一個:
|
pcwszRuntimeVersion |
指向以零結束的寬字元字串,識別這個類別之主機資訊清單中指定的執行時間版本。 |
pcwszTypeName |
指向以零結尾的寬字元字串,其中包含與指定 GUID 相關聯的 .NET 類別名稱。 |
pcwszAssemblyIdentity |
指向以零結尾的寬字元字串,其中包含裝載此類別之元件的文字識別。 For more information about textual identity, see "Specifying Fully Qualified Type Names" under "Discovering Type Information at Run Time" under "Programming with the .NET Framework" in the .NET Framework SDK. |
Unmanaged 應用程式可以使用以這種方式傳回的資訊來載入正確的.NET Framework版本、載入pcwszAssemblyIdentity元素所識別的元件,然後建立pcwszTypeName元素所命名之類別的實例。
範例
使用如下所示的動態連結來呼叫 SxsLookupClrGuid 函式 :
#include <windows.h>
// Declare a type for a SxsLookupClrGuid function pointer:
typedef BOOL (WINAPI* PFN_SXS_LOOKUP_CLR_GUID)
( IN DWORD dwFlags,
IN LPGUID pClsid,
IN HANDLE hActCtx,
IN OUT PVOID pvOutputBuffer,
IN SIZE_T cbOutputBuffer,
OUT PSIZE_T pcbOutputBuffer );
// Declare an actual function pointer
PFN_SXS_LOOKUP_CLR_GUID pfn_SxsLookupClrGuid;
// Declare a handle for the system DLL
HINSTANCE hSxsDll;
// Other declarations:
BOOL isOK;
GUID exampleGuid =
{0xFDB46CA5, 0x9477, 0x4528, 0xB4, 0xB2,
0x7F, 0x00, 0xA2, 0x54, 0xCD, 0xEA};
#define OUTPUT_BUFFER_SIZE 512
unsigned char outputBuffer[OUTPUT_BUFFER_SIZE];
SIZE_T neededBufferSize;
DWORD errorCode;
#define SXS_LOOKUP_CLR_GUID_USE_ACTCTX (0x00000001)
#define SXS_LOOKUP_CLR_GUID_FIND_SURROGATE (0x00010000)
#define SXS_LOOKUP_CLR_GUID_FIND_CLR_CLASS (0x00020000)
#define SXS_LOOKUP_CLR_GUID_FIND_ANY (0x00030000)
// (SXS_LOOKUP_CLR_GUID_FIND_CLR_CLASS |
// SXS_LOOKUP_CLR_GUID_FIND_SURROGATE)
#define SXS_GUID_INFORMATION_CLR_FLAG_IS_SURROGATE (0x00000001)
#define SXS_GUID_INFORMATION_CLR_FLAG_IS_CLASS (0x00000002)
typedef struct _SXS_GUID_INFORMATION_CLR
{
DWORD cbSize;
DWORD dwFlags;
PCWSTR pcwszRuntimeVersion;
PCWSTR pcwszTypeName;
PCWSTR pcwszAssemblyIdentity;
} SXS_GUID_INFORMATION_CLR, *PSXS_GUID_INFORMATION_CLR;
typedef const SXS_GUID_INFORMATION_CLR *PCSXS_GUID_INFORMATION_CLR;
void main()
{
// Use LoadLibrary to obtain a handle to the "SXS.DLL" system library
hSxsDll = LoadLibrary( "sxs" );
// If SXS.DLL has loaded properly,
// try to obtain a pointer to SxsLookupClrGuid
if( hSxsDll != NULL )
{
pfn_SxsLookupClrGuid = (PFN_SXS_LOOKUP_CLR_GUID) GetProcAddress(
hSxsDll, "SxsLookupClrGuid" );
if( pfn_SxsLookupClrGuid == NULL )
{
// (Handle failure to find SxsLookupClrGuid here...)
}
else
{
isOK = (pfn_SxsLookupClrGuid)(
SXS_LOOKUP_CLR_GUID_FIND_ANY, // dwFlags
&exampleGuid, // pClsid
NULL, // hActCtx
(PVOID) outputBuffer, // pvOutputBuffer
(SIZE_T) OUTPUT_BUFFER_SIZE, // cbOutputBuffer
&neededBufferSize ); // pcbOutputBuffer
if( isOK == FALSE )
{
errorCode = GetLastError( );
if( errorCode == ERROR_INSUFFICIENT_BUFFER )
{
// If the allocation fails because the buffer was too small,
// allocate a larger output buffer, of the size
// now indicated by "neededBufferSize", and try again.
}
else
{
// Handle other errors here
}
}
else
{
// (Use the information here...)
}
}
// Free the library instance when you're done
FreeLibrary( hSxsDll );
}
}
規格需求
需求 | 值 |
---|---|
DLL |
|
另請參閱