我完成了我的小应用程序,并试图确保我没有内存泄漏和错误。查看我的输出后,我注意到我的一个函数抛出了 First-Chance 异常,但该函数运行良好并且不会崩溃。
该函数调用 CLR C++ DLL 中的另一个函数。我删除了 DLL 函数中的几乎所有代码只是为了进行测试,但仍然抛出异常,所以我知道问题出在我的 EXE 函数中。
这是EXE函数调用DLL函数的代码。
LPCTSTR CHAXC0RDlg::Encrypt(LPCTSTR strValue)
{
const char* Return;
HINSTANCE hDLL = LoadLibrary(L"Library.dll");
if(hDLL)
{
FARPROC hMethod = GetProcAddress(HMODULE (hDLL), "Encrypt");
if(hMethod)
{
typedef const char* (*FunctionSig)(LPCTSTR);
FunctionSig MethodCall = FunctionSig(hMethod);
Return = MethodCall(strValue);
FreeLibrary(hDLL);
}
}
return _tcsdup(CString(Return));
}
这是 DLL 函数(如您所见,我删除了所有代码,除了生成返回值的代码作为测试):
const char* Encrypt(LPCTSTR strPValue)
{
String^ strValue = gcnew String(strPValue);
string strReturn = (const char*)(Marshal::StringToHGlobalAnsi(strValue)).ToPointer();
char* csValue = new char[strReturn.size()];
strcpy(csValue, strReturn.c_str());
return const_cast<const char*> (csValue);
}
EXE 函数在“ const char* Return = MethodCall(strValue);
”上引发异常(我启用了对这个异常的中断,这就是我所知道的)。
为什么这个函数会抛出这个异常?
谢谢你!
编辑
更新:我的字符集是 UNICODE。
更新#2:根据我在建议和答案中读到的内容,您假设此代码不起作用,但确实有效。我启用了对第一次机会异常的中断(是的,我确实知道什么是第一次机会异常),因为我希望这个程序质量很好,所有错误都消失了。代码运行良好,我只是想弄清楚为什么会抛出第一次机会异常,因为我喜欢成为一个更好的程序员。所以我想解决这个问题。
更新#3:我现在让我的代码检查 hDLL 和 hMethod 的值,并且在运行此函数时两者都不为空。问题似乎在于对 DLL 的调用。我假设函数签名是 100% 正确的,因为这段代码确实有效,它只是抛出了第一次机会异常。
更新#4:我在上面的函数中添加了新的更改,并添加了 DLL 函数代码。DLL 函数是一个 CLR C++ DLL。如前所述,我删除了 DLL 函数中的所有代码,以确保它不是我的 DLL。