在c++中使用innetwork::GetNetworkConnections()

using INetwork::GetNetworkConnections() in C++

本文关键字:GetNetworkConnections innetwork c++      更新时间:2023-10-16

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

我代码:

#include "stdafx.h"
#include "windows.h"
#include "Netlistmgr.h"
int _tmain(int argc, _TCHAR* argv[])
{
    HRESULT hResult = INetwork::GetNetworkConnections( ?? );
    return 0;
}

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

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

#include "stdafx.h"

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

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

确保你得到正确的!


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

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

我假设你很了解c++语言,知道这是什么意思。这个函数要修改一个指针变量,而它能修改的唯一方法就是在指向那个对象的指针上工作。所以你最终得到了双指针,因为你修改了一个指针。

同样,文档在描述参数时为您提供了它是如何工作的线索:

ppEnum [out]

指针,该指针接收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代码通常是丑陋的。如果你足够勇敢,你可以省略错误检查,但我不建议你这么做。

相关文章:
  • 没有找到相关文章