尝试使用 urlmon.dll 下载文件时如何修复 "Run-Time Check Failure #0" 错误?

How to fix "Run-Time Check Failure #0" error when trying to download a file with urlmon.dll?

我使用 urlmon.dll.

用 C++ 编写了一个下载程序

我使用 Visual Studio 2015 RTM 作为 IDE。

这是我的代码:

// ConsoleApplication1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include "clocale"
#include "fstream"
#include "iostream"
#include "string"
using namespace std;

typedef int*(*tdDosyaIndir)(void*, char*, char*, DWORD, void*);

int main()
{
setlocale(LC_ALL, "turkish");

string strAdres;

cout << "İndirilecek adresi girin:\n";
cin >> strAdres;

HINSTANCE dll = LoadLibrary(L"urlmon.dll");
tdDosyaIndir DosyaIndir = (tdDosyaIndir)GetProcAddress(dll, "URLDownloadToFileA");

DosyaIndir(0, &strAdres[0u], "dosya.html", 0, 0);

FreeLibrary(dll);

return 0;
}

但问题是当我尝试下载某些程序时显示此错误:

我应该怎么做才能解决这个问题?

您需要在函数指针类型定义中指定调用约定。

Windows API 函数通常使用 __stdcall 调用约定。但是,C 和 C++ 函数通常使用 __cdecl 调用约定,这是编译器的默认设置。当调用约定不匹配时,编译器会生成错误代码,您会收到此错误消息。

为确保编译器生成正确的代码来调用该函数,您的 typedef 应如下所示:

typedef HRESULT (__stdcall *tdDosyaIndir)(void*, char*, char*, DWORD, void*);