Как импортировать IWinHttpRequest в проект MSVC ++? - PullRequest
1 голос
/ 29 марта 2020

Я искал пример кода от Microsoft для использования WinHTTP через COM, см .: https://docs.microsoft.com/en-us/windows/win32/winhttp/iwinhttprequest-open

Первые несколько строк кода следующие:

#include <windows.h>
#include <stdio.h>
#include <objbase.h>

#include "httprequest.h"

#pragma comment(lib, "ole32.lib")
#pragma comment(lib, "oleaut32.lib")

// IID for IWinHttpRequest.
const IID IID_IWinHttpRequest =
{
  0x06f29373,
  0x5c5a,
  0x4b54,
  {0xb0, 0x25, 0x6e, 0xf1, 0xbf, 0x8a, 0xbf, 0x0e}
};

int main()
{
    // Variable for return value
    HRESULT    hr;

    // Initialize COM
    hr = CoInitialize( NULL );

    IWinHttpRequest *  pIWinHttpRequest = NULL;

Меня смущает правильный путь к #include типу IWinHttpRequest. Я думаю, что это происходит из файла httprequest.h, который не является системным включаемым файлом.

Также, я думаю, httprequest.h является результатом компиляции httprequest.idl. Я должен вручную скомпилировать httprequest.idl, или, поскольку это часть Windows SDK, есть ли лучший способ получить доступ к этому типу?

Ответы [ 2 ]

2 голосов
/ 30 марта 2020

Ну, заранее ничего не зная об этом, я посмотрел интерфейс, который вы дали, IWinHttpRequest. Я пошел в реестр и искал его в HKCR \ Interface, нашел в реестре typelib для интерфейса. Типовая библиотека: HKEY_CLASSES_ROOT \ TypeLib \ {662901F C -6951-4854-9EB2-D9A2570F2B2E}. Из библиотеки типов посмотрел HKEY_CLASSES_ROOT \ TypeLib \ {662901F C -6951-4854-9EB2-D9A2570F2B2E} \ 5.1 \ 0 \ win32. Запись win32 показывает, где находится расположение typelib на диске:% SystemRoot% \ system32 \ winhttpcom.dll

Поскольку% SystemRoot% \ system32 напрямую всегда находится в пути, вы можете использовать typelib просто так this:

#import "winhttpcom.dll"

За кулисами компилятор Visual C ++ создаст файлы с именами winhttpcom.tlh и winhttpcom.tli. Вы можете игнорировать эти файлы. Компилятор просто автоматически включает и связывает эти файлы.

Он объявляет интеллектуальные указатели COM в файле .tlh:

_COM_SMARTPTR_TYPEDEF(IWinHttpRequest, __uuidof(IWinHttpRequest));
_COM_SMARTPTR_TYPEDEF(IWinHttpRequestEvents, __uuidof(IWinHttpRequestEvents));

Все это будет заключено в пространство имен C ++:

namespace WinHttp { 
// definitions in here
}

Если вам не нужны пространства имен, вы можете сделать что-то вроде:

#import "winhttpcom.dll" no_namespace

Документация для #import находится по адресу https://docs.microsoft.com/en-us/cpp/preprocessor/hash-import-directive-cpp?view=vs-2019

1 голос
/ 30 марта 2020

Просто отсутствуют инструкции о том, как получить файл httprequest.h. В Windows SDK есть только файл .idl. Это как-то необычно, многие Windows API имеют .idl и .h, некоторые имеют только .h, некоторые имеют только .idl ... Но вы можете создать .h из .idl:

Это пример вывода:

**********************************************************************
** Visual Studio 2019 Developer Command Prompt v16.5.1
** Copyright (c) 2019 Microsoft Corporation
**********************************************************************

C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional>midl httprequest.idl /out D:\MyPath\MyAppDir
Microsoft (R) 32b/64b MIDL Compiler Version 8.01.0622
Copyright (c) Microsoft Corporation. All rights reserved.
Processing C:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\um\httprequest.idl
httprequest.idl
Processing C:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\um\oaidl.idl
oaidl.idl
Processing C:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\um\objidl.idl
objidl.idl
Processing C:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\um\unknwn.idl
unknwn.idl
Processing C:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\shared\wtypes.idl
wtypes.idl
Processing C:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\shared\wtypesbase.idl
wtypesbase.idl
Processing C:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\shared\basetsd.h
basetsd.h
Processing C:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\shared\guiddef.h
guiddef.h
Processing C:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\um\oaidl.acf
oaidl.acf

Он создаст 3 файла: httprequest.h, httprequest.tlb и httprequest_i.c в каталоге вашего проекта.

Теперь вы сможете скомпилировать пример кода. Обратите внимание, что если вы включите файл httprequest_i.c, вы даже можете удалить ручное объявление IID_IWinHttpRequest в примере.

...