我做了一个小应用程序,我在应用程序类的Init实例中加载了一个DLL。下面提到的代码运行正常,但在发布模式下崩溃。我使用Visual Studio,DLL在应用程序的Debug和Release文件夹中。
typedef char BufType[4095];
typedef int (*QuickLicenseRT)(BufType);
BufType Buf;
QuickLicenseRT pQuickLicense;
HINSTANCE QL_Lib;
char* Message;
int i, BufSize;
BOOL CDemo::InitInstance()
{
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);
InitCtrls.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);
CWinApp::InitInstance();
QL_Lib = LoadLibrary(_T("QuickLicenseRuntime.dll"));
pQuickLicense = (QuickLicenseRT)GetProcAddress(QL_Lib, "QuickLicenseRT");
Message = "ABC";
BufSize = strlen(Message);
for(i=0; i<BufSize; i++)
Buf[i]= Message[i];
Buf[BufSize] = 0;
MessageBox(NULL, _T("before pQuickLicense (Buf)"), _T("Message"), MB_OK);
(pQuickLicense)(Buf); // here it is crashing
MessageBox(NULL, _T("after pQuickLicense (Buf)"), _T("Message"), MB_OK);
ResponseMessage = Buf;
return TRUE;
}
我在一些陈述之后放了一些消息框。我注意到在(pQuickLicense)(Buf),它崩溃了。加载QuickLicenseRuntime.dll后,我得到了函数的地址。我没有得到它的错误。
谢谢
答案 0 :(得分:1)
Buf[BufSize] = 0;
已经从Buf区域写出理论上破坏了pQuickLicense - 实际上它不应该因为填充而造成伤害。 Buf[BufSize-1] = '\0';
会更合适。
您还可以修改typedef int (*QuickLicenseRT)(BufType);
以定义调用约定,即__cdecl或FAR PASCAL。使用错误的调用约定可能会破坏您的数据存储器。
通常,您的编程风格可以从考虑一些关于C ++的基本知识中受益,即Kerningham&amp; Ritchie“C语言编程”。