Visual c++ mfc中的DLL函数出错

Visual c++ mfc中的DLL函数出错,visual-c++,dll,mfc,Visual C++,Dll,Mfc,我制作了一个小应用程序,其中我在应用程序类的Init实例中加载了一个DLL。下面提到的代码运行正常,但在发布模式下会崩溃。我使用了VisualStudio,在应用程序的调试和发布文件夹中有一个DLL typedef char BufType[4095]; typedef int (*QuickLicenseRT)(BufType); BufType Buf; QuickLicenseRT pQuickLicense; HINSTANCE Q

我制作了一个小应用程序,其中我在应用程序类的Init实例中加载了一个DLL。下面提到的代码运行正常,但在发布模式下会崩溃。我使用了VisualStudio,在应用程序的调试和发布文件夹中有一个DLL

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;
typedef char BufType[4095];
typedef int(*QuickLicenseRT)(BufType);
Buf型Buf;
QuickLicenseRT pQuickLicense;
Hinql_Lib;
字符*消息;
inti,BufSize;
boolcdemo::InitInstance()
{
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize=sizeof(InitCtrls);
InitCtrls.dwICC=ICC_WIN95_类;
InitCommonControlsEx(&InitCtrls);
CWinApp::InitInstance();
QL_Lib=LoadLibrary(_T(“QuickLicenseRuntime.dll”);
pQuickLicense=(QuickLicenseRT)GetProcAddress(QL_Lib,“QuickLicenseRT”);
Message=“ABC”;
BufSize=strlen(消息);

对于(i=0;i
Buf[BufSize]=0;
已经从Buf区域写入,理论上会损坏pQuickLicense——实际上它不应该因为填充而造成伤害。
Buf[BufSize-1]='\0';
更合适

您还可以修改
typedef int(*QuickLicenseRT)(BufType);
来定义调用约定,即\uu cdecl或FAR PASCAL。使用错误的调用约定可能会损坏数据内存


一般来说,你的编程风格可以从一些基本的C++知识中获益,即C宁汉和里奇“C编程”。< /P>总是检查你的代码> LooLoopLogy](<代码)>代码> GETPro(DLL)/<代码>调用——如果它们不是NULL,那么崩溃就在<代码> QuestLink()/<代码>逻辑(在RealDebug中),您可能需要构建一些可选的诊断日志以查看它在何处崩溃;调试和发布构建之间的主要区别之一是指针初始化…给定代码逻辑,
Buf[BufSize-1]='\0'
将错误地截断字符串。不管怎样,由于
BufSize
是从无关数据推导出来的,因此使用
BufSize
BufSize-1
作为索引同样是错误的。一个动态大小的数组,如
std::vector
将解决所有问题。但是,缺少的调用约定将是一个ime是崩溃的候选。函数指针类型应该可以通过库附带的头文件获得。@Girish:您使用strlen而不是sizeof编辑了问题中的代码,让我困惑了一分钟。新代码
Message=“ABC”;BufSize=strlen(Message);Buf[BufSize]=0;
只在已经存在的地方写入“\0”字符,因为
strlen()
只对字符进行计数,直到找到空字符为止。如果确实需要初始化缓冲区,请
尝试Buf[0]=0或memset(Buf,0,sizeof(Buf));
如果只想复制字符串,请使用单行
strcpy(Buf,Message);
已足够。这是不正确的。复制字符的循环的终止条件为
i@IInspectable:您缺少BufSize(3)是从strlen(Buf)派生的,假设Buf[3]处有空字符。我很清楚源字符串有零终止符。但是,缓冲区副本没有,并且
Buf[BufSize]=0
是必需的。
Buf
是一个本地对象,因此不是零初始化的。这不是一个静态存储持续时间为零的对象(应该是零初始化的)。编辑:我假设
Buf
是一个本地对象。它不是(出于任何原因),并且
Buf[BufSize]=0
不是必需的。