Как исправить ошибку «Run-Time Check Failure # 0» при попытке скачать файл с urlmon.dll? - PullRequest
0 голосов
/ 10 февраля 2019

Я написал загрузочную программу на C ++, используя urlmon.dll .

Я использовал RTM Visual Studio 2015 в качестве 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;
}

Но проблема в том, что когда я пытаюсь загрузить что-то, программа показывает эту ошибку:

screenshot of dialog box

Что делать вЧтобы решить эту проблему?

1 Ответ

0 голосов
/ 10 февраля 2019

Необходимо указать соглашение о вызовах в указателе функции typedef.

Функции Windows API, как правило, используют __stdcall соглашение о вызовах.Однако функции C и C ++ обычно используют соглашение о вызовах __cdecl, и это по умолчанию компилятор.При несоответствии соглашения о вызовах компилятор генерирует неправильный код, и вы получаете это сообщение об ошибке.

Чтобы убедиться, что компилятор генерирует правильный код для вызова функции, ваш typedef для нее должен выглядеть так:это:

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