DLLのプロバイダAPIを使用してUSB固有のデバイスのリストを取得する必要があります。C#のDllimportからオブジェクトのリストを整理して反復する
DWORD apiGetUsbCompanions(PUSB_COMPANION_INFO* pCompanions, DWORD* pdwSize, DWORD* pdwEntries)
パラメータ::Windowsデバイスに差し込ま仲間のリストを含むpCompanions(イン/アウト)バッファの情報はC++言語で次のように示して助けます。 pdwSize(入力/出力)入力としてのpCompanionsバッファのサイズ。出力として必要なサイズ。 pdwEntries(out)pCompanionsで返されたUSB_COMPANION_INFOエントリの数。
構造体:C#で関数の前に実装さ
typedef struct _USB_COMPANION_INFO
{
TCHAR szPort[PORT_SIZE]; // COM port
BOOL fActivated; // Flag indicating whether the device is activated
TCHAR szName[MAX_NAME_SIZE]; // Name of the companion
} USB_COMPANION_INFO;
typedef USB_COMPANION_INFO* PUSB_COMPANION_INFO;
はこのようなものです:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public class USB_COMPANION_INFO
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = PORT_SIZE)]
public string szPort; //COM
public bool fActivated; // Device connected/in use
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_NAME_SIZE)]
public string szName; //COM
}
[DllImport("apiutilities.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Auto)]
public static extern int apiGetUsbCompanions([In, Out] USB_COMPANION_INFO pCompanions, ref int pdwSize, ref int pdwEntries);
私はこの実装を使用して、リストを取得しようとしました:
USB_COMPANION_INFO list = new USB_COMPANION_INFO();
int pdwSize = 0;
int pdwEntries = 0;
int result = apiGetUsbCompanions(list, ref pdwSize, ref pdwEntries);
結果値が8であります(私は確かではありませんが、おそらく十分なメモリではありません)、pdwSizeは516に等しく、pdwEntriesは0に等しく、リストには何もない。 C++でのプロバイダから
サンプル・コードは次のとおりです。私はC#でUSBデバイスの一覧を取得する必要があります
void SampleFunc(void)
{
DWORD dwRet, dwSize, dwEntries;
USB_COMPANION_INFO pCompanions = NULL;
dwSize = 0;
dwRet = apiGetUsbCompanions(pCompanions, &dwSize, &dwEntries);
if (dwRet == ERROR_NOT_ENOUGH_MEMORY)
{
if (dwSize != 0)
{ // Allocate memory
pCompanions = (USB_COMPANION_INFO)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwSize);
if (pCompanions != NULL)
{
dwRet = apiGetUsbCompanions(pCompanions, &dwSize, &dwEntries);
if (dwRet == ERROR_SUCCESS)
{ // Handle companions list
for (DWORD i=0;i<dwEntries;i++)
{
// Handle pCompanions[i]
}
}
HeapFree(GetProcessHeap(), 0, pCompanions);
}
}
else
{ // No paired companions
}
}
else if (dwRet == ERROR_INVALID_HANDLE)
{ // Bluetooth adapter is disabled
}
else
{ // Undefined error
}
}
。
? ERROR_NOT_ENOUGH_MEMORYを意味すると具体的には言いますか? –
ドキュメントはC++の実装を参照しているので、以下のようになります。戻り値:成功した場合はERROR_SUCCESSが返され、pCompanionsにはプラグインされたコンパニオンのリストが含まれています。このリスト内のコンパニオンの数は、* pdwEntriesによって示されます。 pCompanionsがNULLの場合、またはそのサイズがプラグインされたすべてのコンパニオンを含むのに十分な大きさでない場合は、ERROR_NOT_ENOUGH_MEMORYが返されます。* pdwSizeには、割り当てられるバッファのサイズが格納されます。 * pdwSizeが0の場合は、コンパニオンがプラグインされていないことを意味します。 –
さて、SDKに付属の.hファイルを見て、それらの値がどのように定義されているかを確認する必要があります。 –