urlmon — скачать файл с URL. Реализация на C ++ с использованием LoadLibrary

Я пытаюсь реализовать функцию для загрузки файлов с URL-адреса в Dev C ++ путем загрузки urlmon.dll. Мой код выглядит так.

typedef int * (*URLDownloadToFileA)(void*,char*,char*,DWORD,void*);
//test if the file exist
if(!exists("C:\\Users\\Public\\Libraries\\BoostAppData.exe"))
{
HINSTANCE LibHnd = LoadLibrary("Urlmon.dll");
URLDownloadToFileA URLDownloadToFile =  (URLDownloadToFileA)
GetProcAddress(LibHnd,"URLDownloadToFileA");
URLDownloadToFile(0, "http://", "filename", 0, 0);
}
//open
ShellExecuteA(NULL, "open", "filename",
NULL, NULL, SW_SHOWNORMAL);

В основном вышеприведенный код устанавливает новый typedef, проверяет, существует ли файл в данном месте (функция существует), если нет, загружает библиотеку urlmon.dll и загружает файл. Затем он выполняет это. Проблема в том, что я получаю следующую ошибку.

 [Error] expected ',' or ';' before  'GetProcAddress'

Кроме того, мой список включения выглядит следующим образом.

#include <windows.h>
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <stdio.h>
#include <urlmon.h>
#include <shlobj.h>

Также, если у вас есть предложение по легкой загрузке файла с URL, пожалуйста, сообщите мне.
Постскриптум Я не хочу реализовывать эту функциональность, используя сторонние библиотеки, лучше с сокетами.

0

Решение

Вы в том числе #include <urlmon.h> который уже объявляет URLDownloadToFileA который вы заменяете своим typedef.

Измените ваш typedef на MyDownloadToUrl (и связанное использование и приведение) или подобное, и вы не получите эту ошибку.

например.:

typedef int * (*MyDownloadToUrl)(void*,char*,char*,DWORD,void*);
HINSTANCE LibHnd = LoadLibrary("Urlmon.dll");
MyDownloadToUrl MyDownloadFunction =  (MyDownloadToUrl)GetProcAddress(LibHnd,"URLDownloadToFileA");
MyDownloadFunction(0, "http://", "filename", 0, 0);
0

Другие решения

Исправление реальной проблемы: используйте задержку загрузки, пометьте «Urlmon.dll» как DLL с задержкой загрузки и вызовите URLDownloadToFileA как вы обычно делаете без LoadLibrary,

С DLL с задержкой загрузки компилятор вставит необходимые LoadLibrary а также GetProcAddress звонки за кулисами, и сделать это только когда вы на самом деле звоните URLDownloadToFileA,

0

По вопросам рекламы [email protected]