2015-09-02 42 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