2015-09-02 90 views
-1

我對C++來說很新穎,閱讀越多的問題越多。設計一個Win32api應用程序

我想將我的舊C代碼(其中列出了機器上的設備)轉換爲設計良好的C++代碼。

正如我所讀,C++最基本的概念之一是容器,迭代器和算法的隔離。 這就是說,我進入了結論,我應該創建3類:

  1. 設備接口 - 保存單個接口信息,如SP_DEVICE_INTERFACE_DATA,PSP_DEVICE_INTERFACE_DETAIL_DATA和SP_DEVINFO_DATA

  2. DevicesInterfaceContainer - 集裝箱莫明以DeviceInterface類的形式保存所有設備信息。

  3. DeviceInterfaceIterator - 由算法用於迭代DevicesInterfaceContainer中的項目。

我沒有設法執行它,因爲我不知道該怎麼做。

  1. 迭代器應該是初始化DevicesInterfaceContainer的輸出迭代器嗎?或者DevicesInterfaceContainer是否應該自行初始化並獲取所有設備?

  2. Win32 API在構造函數中失敗時會發生什麼?我應該拋出異常嗎?如果是的話,什麼樣的例外?的std ::例外?的std :: runtime_error?還是應該定義一個我自己的Win32Exception,它包含有關LastError的信息? (所有我需要的是,以格式化消息的最後一個錯誤。)

喜歡的東西:

class DeviceInterfacesList 
{ 
public: 
    DeviceInterfacesList(GUID& rtInterfaceGuid) 
    { 
     m_hDevInfo = SetupDiGetClassDevs(
      &rtInterfaceGuid, 
      NULL, 
      NULL, 
      DIGCF_DEVICEINTERFACE 
     ); 
     if (INVALID_HANDLE_VALUE == m_hDevInfo) 
     { 
      throw Win32Exception(); 
     } 
    } 

    ... 
    ... 
    ... 

    HDEVINFO m_hDevInfo; 
}; 

我會很高興得到一些指導/好更新的例子使用STL + WIN32API或任何會澄清我的問題的東西。

在此先感謝。

+0

在Windows環境中,您應該返回錯誤代碼(HRESULT)而不是拋出C++異常(除非您在自己的代碼中保留這些異常) –

+0

@SimonMourier:當遵循RAII語言來包裝系統資源和API調用時,請使用的C++異常是強制性的。這些例外也允許在您的代碼之外旅行。如果沒有人捕獲到你的一個異常,調用* unexpected *處理程序(默認情況下終止程序)。 – IInspectable

+0

@IInspectable - 當然,但是,這是有點我的觀點,因爲我特別談論Windows編程,通常不會遵循這個習慣用法 –

回答

-1

如果你想使用C++ STL,你的問題可能比你想象的要容易。 首先,你需要設計一個類來保存必要的信息,即 即「DeviceInterface」。你可以定義這個類的成員和函數。

您可以使用STL容器,例如deque或list作爲容器。該代碼將是這樣的:

deque<DeviceInterface> DIList; 

至於迭代器,C++ STL爲您提供使用標準的方式:

for(auto it = DIList.begin(); it != DIList.end; ++it){ 
    *it->getData(); 
} 

我希望這可以幫助你。

+0

嗨,謝謝你的回答。如何處理win33錯誤(我的第二個問題)? – CodeNinja