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

我是新的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。 果然,这实际上是一个由INetworkListManager接口提供的COM API。 所以比调用这个单一函数要复杂得多。

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代码经常是丑陋的,如果你很勇敢,可以省略错误检查,但是我不推荐它。)