mfc中的DLL函数出错

时间:2015-01-02 06:23:42

标签: visual-c++ dll mfc

我做了一个小应用程序,我在应用程序类的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后,我得到了函数的地址。我没有得到它的错误。

谢谢

1 个答案:

答案 0 :(得分:1)

Buf[BufSize] = 0;已经从Buf区域写出理论上破坏了pQuickLicense - 实际上它不应该因为填充而造成伤害。 Buf[BufSize-1] = '\0';会更合适。

您还可以修改typedef int (*QuickLicenseRT)(BufType);以定义调用约定,即__cdecl或FAR PASCAL。使用错误的调用约定可能会破坏您的数据存储器。

通常,您的编程风格可以从考虑一些关于C ++的基本知识中受益,即Kerningham&amp; Ritchie“C语言编程”。