在 C++ 中使用 INetwork::GetNetworkConnections()

问题描述 投票:0回答:2

我是 C++ 新手,我正在寻找一个代码示例,如何编写要在 GetNetworkConnections() 中设置的枚举。 文档没有代码示例如何操作。

我的代码:

#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
2个回答
10
投票

要事第一!您的示例代码已经是错误的。包含系统标头的语法与项目中标头的语法不同。

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

#include "stdafx.h"

系统标头(如

windows.h
)使用尖括号包含在内,如下所示:

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

确保您答对了!


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

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

我假设您足够了解 C++ 语言,知道这意味着什么。该函数将修改指针变量,而它修改某些内容的唯一方法是作用于指向该对象的指针。所以你最终会得到双指针,因为你正在修改一个指针。

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

ppEnum [输出]

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

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

该函数返回一个

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


这就是调用

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

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

如果您在文档中升级,从 API“参考”转到“关于”API 页面,您通常会看到一些示例代码。例如,这里

不幸的是,这不会告诉您或向您展示您需要了解的有关 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 代码通常很丑陋。如果你勇敢的话,你可以省略错误检查,但我不推荐它。)


-1
投票

我知道,我知道。 12年前。 但我不同意: COM并不难看,它需要理解。

© www.soinside.com 2019 - 2024. All rights reserved.