2015-09-11 40 views
0

我有一個藍牙串行設備,我需要連接到。我可以查詢WMI數據的基礎上,找到藍牙端口,我需要通過使用我可以通過編程從WPF應用程序中確定哪些虛擬COM端口正在傳入,哪些正在傳出?

Get-WmiObject -query "select DeviceID,PNPDeviceID from Win32_SerialPort" 

或使用註冊表通過檢查

HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM\Device\BthModem0

但是我無法找到一個公開的API,允許我確定兩個創建的虛擬COM端口中的哪一個是傳入和傳出。

如果您在設備管理器中深入挖掘並因此應該可用(通過PInvoke或其他東西?),但是我需要找到一種方法從WPF應用程序中以編程方式找到該信息。

回答

0

您正在尋找的是獲得設備功能。

注意區別:開放端口是 Incoming vs Outgoing Port Capabilities

我創建已經做了你基於以下example所需要的樣本C++樣本。您將需要使用PINVOKE來調用適當的方法。很抱歉,我無法提供C#代碼作爲我的工作。

這取決於Microsoft藍牙堆棧。您需要對widcomm或Toshiba藍牙堆棧進行一些修改。

您可以獲取從Github

樣品得到它的工作,你需要將以下添加到鏈接選項

Setupapi.lib Ole32.lib

#include "stdafx.h" 
#include <stdio.h> 
#include <windows.h> 
#include <setupapi.h> 
#include <devguid.h> 
#include <regstr.h> 
#include "Objbase.h" 

int main(int argc, char *argv[], char *envp[]) 
{ 
    HDEVINFO hDevInfo; 
    SP_DEVINFO_DATA DeviceInfoData; 
    DWORD i; 
    CLSID guid; 
    //Class = Ports 
    //ClassGuid = { 4d36e978 - e325 - 11ce - bfc1 - 08002be10318} 


    LPCOLESTR guidString = L"{86E0D1E0-8089-11D0-9CE4-08003E301F73}"; 
    HRESULT a = CLSIDFromString(guidString, &guid); 
    // Create a HDEVINFO with all present devices. 
    hDevInfo = SetupDiGetClassDevs(&guid, 
     0, // Enumerator 
     0, 
     DIGCF_DEVICEINTERFACE); 

    if (hDevInfo == INVALID_HANDLE_VALUE) 
    { 
     // Insert error handling here. 
     return 1; 
    } 

    // Enumerate through all devices in Set. 

    DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA); 
    for (i = 0;SetupDiEnumDeviceInfo(hDevInfo, i, 
     &DeviceInfoData);i++) 
    { 
     DWORD DataT; 
     LPTSTR buffer = (LPTSTR)LocalAlloc(LPTR, 4096 * 2); 
     DWORD buffersize = 4096; 

     LPBYTE buffer2 = (LPBYTE)LocalAlloc(LPTR, 4096 * 2); 



     SetupDiGetDeviceRegistryProperty(
      hDevInfo, 
      &DeviceInfoData, 
      SPDRP_FRIENDLYNAME, 
      &DataT, 
      (PBYTE)buffer, 
      buffersize, 
      &buffersize); 





     if (wcsstr(buffer, L"Standard Serial over Bluetooth link")) 
     { 
      SetupDiGetDeviceRegistryProperty(
       hDevInfo, 
       &DeviceInfoData, 
       SPDRP_CAPABILITIES, 
       &DataT, 
       (PBYTE)buffer2, 
       buffersize, 
       &buffersize); 

      wprintf(L"Result:%s - ", buffer); 
      int a = *buffer2; 
      if (a == 0xC0) 
      { 
       wprintf(L"Incoming"); 
      } 
      else if (a == 0xC4) 
      { 
       wprintf(L"Outgoing"); 
      } 

      wprintf(L"\n", buffer); 

     } 

     if (buffer) LocalFree(buffer); 
    } 


    if (GetLastError() != NO_ERROR && 
     GetLastError() != ERROR_NO_MORE_ITEMS) 
    { 
     // Insert error handling here. 
     return 1; 
    } 

    // Cleanup 
    SetupDiDestroyDeviceInfoList(hDevInfo); 
    getchar(); 
    return 0; 
} 

Result

+0

我知道你說你不能分享e C#代碼,因爲這是您的工作。不幸的是,這意味着這不是OP的真正答案。也許你可以提供一些關於_how_與C#中的本地代碼進行交互的提示?這對未來的讀者會更有幫助。 –

+0

它看起來像OP有3個問題: 1.我怎樣才能知道傳出和傳入端口之間的區別。 2.什麼API可以用來發現差異 3.可以從WPF(.net) 完成問題是我不知道給PINVOKE樣本的最佳方式是什麼。 –

+0

夠公平的。我只是在尋找更多與C#集成的關係。感謝好的C++。 –

相關問題