Я разрабатываю консольное приложение C ++ для динамической загрузки DLL.
Приложение может успешно вызвать одну из функций DLL. Но в конце выполнения выдается исключение поврежденной кучи. Конкретное значение:
Stack cookie instrumentation code detected a stack-based buffer overrun.
Интересно, почему … Вот код.
#include <iostream>
#include <string>
#include "windows.h"
using namespace std;
typedef DOUBLE(CALLBACK* DllFunc)(DOUBLE, DOUBLE);
int _tmain(int argc, _TCHAR* argv[])
{
HINSTANCE hDLL; // Handle to DLL
DllFunc dllFunc1;
DOUBLE p1 = 2.0, p2 = 4.0, r;
wstring dllName;
string functionName;
cout << "Insert the dll name: " << endl;
getline(wcin, dllName);
cout << "Insert the function name:" << endl;
getline(cin, functionName);
cout << "Insert the first value: " << endl;
cin >> p1;
cout << "Insert the second value" << endl;
cin >> p2;
hDLL = LoadLibrary(dllName.c_str());
if (hDLL != NULL)
{
cout << "DLL loaded: " << hDLL << endl;
functionName = "?" + functionName + "@MyMathFuncs@MathFuncs@@SANNN@Z";
dllFunc1 = (DllFunc)GetProcAddress(hDLL, functionName.c_str());
if (!dllFunc1)
{
// handle the error
FreeLibrary(hDLL);
cout << "Function not found!" << endl;
}
else
{
// call the function
r = dllFunc1(p1, p2);
cout << "The result is: " << r << endl;
FreeLibrary(hDLL);
}
}
else {
cout << "Dll not found" << endl;
}
cout << "Press any key to exit." << endl;
int i;
cin >> i;
return 0;
}
Я не знаю, в чем может быть проблема: если библиотека загружена правильно, я освобождаю ее; там нет указателей и я не использую буфер …
Любая идея? Исключение возникает только тогда, когда выполнение достигает последней закрытой фигурной скобки …
Это больше похоже на проблему стека (которая может повлиять на сообщение об ошибке). Правильно ли ваше соглашение о вызовах? CALLBACK может быть __stdcall
в то время как украшение, кажется, указывает __cdecl