三次调用函数后可执行文件崩溃
Executable Crashing After Calling Function Thrice
我想让大家知道我是 C++ 的新手(对于在同一天就同一项目提出两个问题感到有点内疚)。
运行 下面的循环(或取消注释调用 MyDownloadFunction
然后 运行ning 的五个连续行),将导致应用程序崩溃。
错误信息:
terminate called after throwing an instance of 'std::ios_base::failure' what(): basic_ios::clear
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
我想知道的是为什么如果只调用一次或两次函数它不会崩溃,但如果调用 运行 三次或更多次(第三次,文件已正确保存),当然还有如何修复它。
请假设此问题存在 https://MyWebsite.com
。
#include <iostream>
#include <sstream>
// #include <stdio.h>
// #include <string>
#include <windows.h>
using namespace std;
int main() {
typedef int * (*MyDownloadToUrl)(void*, const char*, const char*, DWORD, void*);
HINSTANCE LibHnd = LoadLibrary("Urlmon.dll");
MyDownloadToUrl MyDownloadFunction = (MyDownloadToUrl)GetProcAddress(LibHnd,"URLDownloadToFileA");
stringstream URL;
stringstream Iteration;
// MyDownloadFunction(NULL, "https://google.ca", "Google 1.htm", 0, NULL);
// MyDownloadFunction(NULL, "https://google.ca", "Google 2.htm", 0, NULL);
// MyDownloadFunction(NULL, "https://google.ca", "Google 3.htm", 0, NULL);
// MyDownloadFunction(NULL, "https://google.ca", "Google 4.htm", 0, NULL);
// MyDownloadFunction(NULL, "https://google.ca", "Google 5.htm", 0, NULL);
for (int i = 1; i <= 5; i++) {
URL << "https://MyWebsite.com/" << i << "/";
cout << URL.str() << "\r\n";
Iteration << i << ".htm";
cout << Iteration.str() << "\r\n\r\n";
MyDownloadFunction(NULL, URL.str().c_str(), Iteration.str().c_str(), 0, NULL);
URL.str("");
Iteration.str("");
}
}
URLDownloadToFile
(以及大多数其他 Windows API 函数)使用 stdcall 调用约定而不是 ccall 约定。另外第一个和最后一个参数不是void*
s,它们是LPUNKNOWN
和LPBINDSTATUSCALLBACK
,而且它是returns一个HRESULT
,而不是一个int*
.通过指向不同类型的指针调用一种类型的函数是未定义的行为。所以您需要将 typedef 更改为:
typedef HRESULT (__stdcall *MyDownloadToUrl)(LPUNKNOWN, const char*, const char*, DWORD, LPBINDSTATUSCALLBACK);
我想让大家知道我是 C++ 的新手(对于在同一天就同一项目提出两个问题感到有点内疚)。
运行 下面的循环(或取消注释调用 MyDownloadFunction
然后 运行ning 的五个连续行),将导致应用程序崩溃。
错误信息:
terminate called after throwing an instance of 'std::ios_base::failure' what(): basic_ios::clear
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
我想知道的是为什么如果只调用一次或两次函数它不会崩溃,但如果调用 运行 三次或更多次(第三次,文件已正确保存),当然还有如何修复它。
请假设此问题存在 https://MyWebsite.com
。
#include <iostream>
#include <sstream>
// #include <stdio.h>
// #include <string>
#include <windows.h>
using namespace std;
int main() {
typedef int * (*MyDownloadToUrl)(void*, const char*, const char*, DWORD, void*);
HINSTANCE LibHnd = LoadLibrary("Urlmon.dll");
MyDownloadToUrl MyDownloadFunction = (MyDownloadToUrl)GetProcAddress(LibHnd,"URLDownloadToFileA");
stringstream URL;
stringstream Iteration;
// MyDownloadFunction(NULL, "https://google.ca", "Google 1.htm", 0, NULL);
// MyDownloadFunction(NULL, "https://google.ca", "Google 2.htm", 0, NULL);
// MyDownloadFunction(NULL, "https://google.ca", "Google 3.htm", 0, NULL);
// MyDownloadFunction(NULL, "https://google.ca", "Google 4.htm", 0, NULL);
// MyDownloadFunction(NULL, "https://google.ca", "Google 5.htm", 0, NULL);
for (int i = 1; i <= 5; i++) {
URL << "https://MyWebsite.com/" << i << "/";
cout << URL.str() << "\r\n";
Iteration << i << ".htm";
cout << Iteration.str() << "\r\n\r\n";
MyDownloadFunction(NULL, URL.str().c_str(), Iteration.str().c_str(), 0, NULL);
URL.str("");
Iteration.str("");
}
}
URLDownloadToFile
(以及大多数其他 Windows API 函数)使用 stdcall 调用约定而不是 ccall 约定。另外第一个和最后一个参数不是void*
s,它们是LPUNKNOWN
和LPBINDSTATUSCALLBACK
,而且它是returns一个HRESULT
,而不是一个int*
.通过指向不同类型的指针调用一种类型的函数是未定义的行为。所以您需要将 typedef 更改为:
typedef HRESULT (__stdcall *MyDownloadToUrl)(LPUNKNOWN, const char*, const char*, DWORD, LPBINDSTATUSCALLBACK);