2017-01-12 4 views
-1

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 
    } 
} 

+0

? ERROR_NOT_ENOUGH_MEMORYを意味すると具体的には言いますか? –

+0

ドキュメントはC++の実装を参照しているので、以下のようになります。戻り値:成功した場合はERROR_SUCCESSが返され、pCompanionsにはプラグインされたコンパニオンのリストが含まれています。このリスト内のコンパニオンの数は、* pdwEntriesによって示されます。 pCompanionsがNULLの場合、またはそのサイズがプラグインされたすべてのコンパニオンを含むのに十分な大きさでない場合は、ERROR_NOT_ENOUGH_MEMORYが返されます。* pdwSizeには、割り当てられるバッファのサイズが格納されます。 * pdwSizeが0の場合は、コンパニオンがプラグインされていないことを意味します。 –

+0

さて、SDKに付属の.hファイルを見て、それらの値がどのように定義されているかを確認する必要があります。 –

答えて

0

おかげで私が見つけた解決策:documenationは8つの手段の戻りコードが言うん何

public List<USB_COMPANION_INFO> GetUsbCompanions() 
{ 
      USB_COMPANION_INFO compInfoUSB = new USB_COMPANION_INFO(); 
      List<USB_COMPANION_INFO> usbCompanions = new List<USB_COMPANION_INFO>(); 

      int pdwSize = 0; 
      int pdwEntries = 0; 
      int result = 0; 

      pdwSize = Marshal.SizeOf(typeof(USB_COMPANION_INFO)); 
      result = apiGetUsbCompanions(compInfoUSB, ref pdwSize, ref pdwEntries); 
      // Retry getting data info if Name is null or empty (Sometimes it fails getting information). Only apply for USB. 
      if (pdwEntries > 0 && string.IsNullOrEmpty(compInfoUSB.szName)) 
      { 
       // Reset communication to force to stop service 
       StopCommunication(); 
       result = apiGetUsbCompanions(compInfoUSB, ref pdwSize, ref pdwEntries); 
      } 

      if (pdwEntries > 0) 
      { 
       for (int i = 0; i < pdwEntries; i++) 
       { 
        usbCompanions.Add(compInfoUSB); 
       } 
      } 

      return usbCompanions; 
} 
関連する問題