【问题标题】:using INetwork::GetNetworkConnections() in C++在 C++ 中使用 INetwork::GetNetworkConnections()
【发布时间】:2011-12-18 02:56:09
【问题描述】:

我是 C++ 新手,我正在寻找如何编写枚举以在 GetNetworkConnections() 中设置的代码示例。 documentation 没有代码示例怎么做。

我的代码:

#include "stdafx.h"
#include "windows.h"
#include "Netlistmgr.h"

int _tmain(int argc, _TCHAR* argv[])
{
    HRESULT hResult = INetwork::GetNetworkConnections( ?? );
    return 0;
}

【问题讨论】:

    标签: c++ windows winapi com


    【解决方案1】:

    首先要做的事!您的示例代码已经错了。系统标头使用的语法与项目中的标头不同。

    项目中的标头包含在标头名称周围的引号中,如下所示:

    #include "stdafx.h"
    

    使用尖括号包含系统标头(如windows.h),如下所示:

    #include <windows.h>
    #include <netlistmgr.h>
    

    确保你得到正确的!


    文档中给出的函数原型表明它接受单个参数,该参数是指向指针的指针:

    HRESULT STDMETHODCALLTYPE GetNetworkConnections(
      [out]  IEnumNetworkConnections **ppEnum
    );
    

    我假设您对 C++ 语言非常了解,知道它的含义。该函数将修改一个指针变量,它可以修改某些内容的唯一方法是让它处理指向该对象的指针。所以你最终得到了双指针,因为你正在修改一个指针。

    同样,文档在描述参数时为您提供了有关其工作原理的线索:

    ppEnum [out]

    指向一个指针,该指针接收枚举机器上所有网络连接的 IEnumNetworkConnections 接口实例。

    你可以通过声明一个正确类型的指针变量来调用它,然后将该变量的地址传递给函数。

    该函数返回一个HRESULT 值,这是COM 函数指示成功或失败的常用方式。您可以使用SUCCEEDED macro来测试函数调用是否成功。


    这就是您调用GetNetworkConnections 函数的方式。但是,哦,我刚刚在最后一段中提到了 COM。果然,这实际上是一个COM API,由INetworkListManager接口提供。所以它比仅仅调用这个单一的函数要复杂得多。

    GetNetworkConnections不是静态方法,所以不能直接从接口调用。您必须实例化一个实现该接口的对象实例,然后调用该对象的成员方法。因此,您需要先在应用程序中初始化 COM,然后再创建CLSID_NetworkListManager COM 对象。

    如果您在文档中更上一层楼,远离 API“参考”并进入“关于”API 页面,您通常会看到一些示例代码。例如,here。

    很遗憾,这不会告诉您或向您展示您需要了解的有关 COM 的所有信息。假设您已经知道如何进行 COM 编程。你应该。查找一些链接以获取更多信息;我这里写不出完整的教程,而且有很多黑暗的角落和小巷等着你绊倒。

    唉,您尝试调用的单个函数的工作示例代码:

    #include "stdafx.h"       // include your app's precompiled header
    #include <windows.h>      // include the base Windows header
    #include <ObjBase.h>      // include the base COM header
    #include <netlistmgr.h>
    
    // Instruct linker to link to the required COM libraries
    #pragma comment(lib, "ole32.lib")
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        // Initialize COM.
       if (SUCCEEDED(CoInitializeEx(NULL, COINIT_MULTITHREADED)))
       {
          // Initializing COM was successful, so declare a pointer
          // to an INetworkListManager object.
          INetworkListManager* pNetworkListManager; 
    
          // Create an instance of the CLSID_NetworkListManger COM object,
          // using the SUCCEEDED macro to test for success.
          if (SUCCEEDED(CoCreateInstance(CLSID_NetworkListManager, NULL,
                                         CLSCTX_ALL, IID_INetworkListManager,
                                         (LPVOID*)&pNetworkListManager)))
          {
             // Creating the object was successful.
             //
             // Declare your pointer to an IEnumNetworkConnections object,
             // which the function call will set.
             IEnumNetworkConnections* pEnum;
    
             // Call the function, passing in the address of your pointer,
             // and test for success using the SUCCEEDED macro.
             if (SUCCEEDED(pNetworkListManager->GetNetworkConnections(&pEnum)))
             {
                   // The function call succeeded.
                   // 
                   // pEnum contains a valid pointer to an IEnumNetworkConnections
                   // object, which you can now use.
                   //
                   // ...
             }
          }
       }
    
       // Uninitialize COM.
       // (This should be called on application shutdown.)
       CoUninitialize();
    
       return 0;
    }
    

    (是的,COM 代码通常很丑陋。如果你有勇气,可以省略错误检查,但我不建议这样做。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-15
      • 2019-05-02
      • 2020-10-14
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多