0

我正在尝试通过加载 urlmon.dll 在 Dev C++ 中实现从 URL 下载文件的功能。我的代码看起来像这样。

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 下载文件的简单实施有建议,请告诉我。PS 我不想使用第三方库来实现这个功能,最好使用套接字。

4

2 回答 2

0

解决真正的问题:使用延迟加载,将“Urlmon.dll”标记为延迟加载的 DLL,然后URLDownloadToFileA像通常没有LoadLibrary.

使用延迟加载的 DLL,编译器将在幕后插入必要的LoadLibrary和调用,并且在您实际调用.GetProcAddressURLDownloadToFileA

于 2015-01-12T17:00:17.077 回答
0

你包括#include <urlmon.h>which 已经声明了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);
于 2015-01-12T15:26:52.543 回答