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

The*_*ask 3 c++ windows com winapi

我是C++的新手,我正在寻找一个代码示例,如何编写在GetNetworkConnections()中设置的枚举.该文件没有一个代码示例如何做到这一点.

我的代码:

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

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

Cod*_*ray 7

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

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

#include "stdafx.h"
Run Code Online (Sandbox Code Playgroud)

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

#include <windows.h>
#include <netlistmgr.h>
Run Code Online (Sandbox Code Playgroud)

确保你弄错了!


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

HRESULT STDMETHODCALLTYPE GetNetworkConnections(
  [out]  IEnumNetworkConnections **ppEnum
);
Run Code Online (Sandbox Code Playgroud)

我假设您已经足够了解C++语言以了解其含义.该函数将修改指针变量,并且它可以修改某些内容的唯一方法是使其处理指向该对象的指针.所以你最终会得到双指针,因为你正在修改指针.

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

ppEnum [out]

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

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

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


这就是你如何称呼这个GetNetworkConnections功能.但是呃哦,我刚才在最后一段提到了COM.果然,这实际上是一个由API提供的COM API INetworkListManager.所以它比调用这个单一函数要复杂得多.

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

如果您在文档中提升级别,远离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;
}
Run Code Online (Sandbox Code Playgroud)

(是的,COM代码通常很难看.如果你很勇敢,你可以省略错误检查,但我不推荐它.)