Я пытаюсь реализовать функцию для загрузки файлов с 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, пожалуйста, сообщите мне.
Постскриптум Я не хочу реализовывать эту функциональность, используя сторонние библиотеки, лучше с сокетами.
Вы в том числе #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);
Исправление реальной проблемы: используйте задержку загрузки, пометьте «Urlmon.dll» как DLL с задержкой загрузки и вызовите URLDownloadToFileA
как вы обычно делаете без LoadLibrary
,
С DLL с задержкой загрузки компилятор вставит необходимые LoadLibrary
а также GetProcAddress
звонки за кулисами, и сделать это только когда вы на самом деле звоните URLDownloadToFileA
,