обо всем по порядку!Ваш пример кода уже неверен.Системные заголовки включены с использованием другого синтаксиса, чем заголовки в вашем проекте.
Заголовки в вашем проекте включены в кавычки вокруг имени заголовка, например:
#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-код часто уродлив. Вы можете пропустить проверку ошибок, если вы смелы, но я не рекомендую ее.)