Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;LoadLibrary抛出第一次机会异常,但有效吗?_C++_Dll_Clr_Loadlibrary_First Chance Exception - Fatal编程技术网

C++ C++;LoadLibrary抛出第一次机会异常,但有效吗?

C++ C++;LoadLibrary抛出第一次机会异常,但有效吗?,c++,dll,clr,loadlibrary,first-chance-exception,C++,Dll,Clr,Loadlibrary,First Chance Exception,我完成了我的小应用程序,我正在努力确保我没有内存泄漏和错误。在查看我的输出后,我注意到我的一个函数抛出了一个First Chance异常,但该函数运行良好,并且没有崩溃 函数调用CLR C++ + DLL中的另一个函数。我删除了DLL函数中几乎所有的代码只是为了测试,但仍然会抛出异常,因此我知道问题出在我的EXE函数上 这是EXE函数调用DLL函数的代码 LPCTSTR CHAXC0RDlg::Encrypt(LPCTSTR strValue) { const char* Return;

我完成了我的小应用程序,我正在努力确保我没有内存泄漏和错误。在查看我的输出后,我注意到我的一个函数抛出了一个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*加密(LPCTSTR strPValue)
{ 
字符串^strValue=gcnew字符串(strPValue);
字符串strReturn=(const char*)(Marshal::StringToHGlobalAnsi(strrvalue)).topenter();
char*csValue=新字符[strReturn.size()];
strcpy(csValue,strReturn.c_str());
返回常量(csValue);
}
EXE函数在“
constchar*Return=MethodCall(strValue);
”上引发异常(我启用了对该异常的中断,这就是我知道的原因)

为什么这个函数会抛出这个异常

谢谢大家!

编辑

更新:我的字符集是UNICODE

更新#2:从我在建议和答案中看到的内容来看,您假设此代码不起作用,但确实起作用。我启用了破发第一次机会异常(是的,我确实知道什么是第一次机会异常),因为我希望这个程序在所有bug消失的情况下具有良好的质量。代码运行得很好,我只是想弄清楚为什么第一次抛出异常,因为我想成为一名更好的程序员。所以我想解决这个问题

更新#3:我现在让我的代码检查hDLL和hMethod的值,并且在运行此函数时两者都不为null。问题似乎在于调用DLL本身。我假设函数签名是100%正确的,因为这段代码确实有效,它只是抛出了一个第一次出现的异常


更新#4:我在上面的函数中添加了新的更改,还添加了DLL函数代码。DLL函数是CLR C++ + DLL。我已经删除了DLL函数中的所有代码,以确保它不是我的DLL。

不清楚您的项目中使用了哪个“字符集”(请参阅配置属性/常规)。在“LoadLibrary”中使用L宏,而在“GetProcAddress”中不使用它

HINSTANCE hDLL = LoadLibrary(L"Library.dll");
FARPROC hMethod = GetProcAddress(HMODULE (hDLL), "Encrypt");
尝试改用_T宏:

HINSTANCE hDLL = LoadLibrary(_T("Library.dll"));
FARPROC hMethod = GetProcAddress(HMODULE (hDLL), "Encrypt");
由于您的项目设置,它将为您设置“L”

编辑:

试一试

并确保模块定义文件包含

LIBRARY      "Library"

EXPORTS
    Encrypt @1

SECTIONS

 .data READ WRITE
也不为什么不用

const char* Encrypt(char* strPValue)

不清楚您的项目中使用了哪个“字符集”(请参阅配置属性/常规)。在“LoadLibrary”中使用L宏,而在“GetProcAddress”中不使用它

HINSTANCE hDLL = LoadLibrary(L"Library.dll");
FARPROC hMethod = GetProcAddress(HMODULE (hDLL), "Encrypt");
尝试改用_T宏:

HINSTANCE hDLL = LoadLibrary(_T("Library.dll"));
FARPROC hMethod = GetProcAddress(HMODULE (hDLL), "Encrypt");
由于您的项目设置,它将为您设置“L”

编辑:

试一试

并确保模块定义文件包含

LIBRARY      "Library"

EXPORTS
    Encrypt @1

SECTIONS

 .data READ WRITE
也不为什么不用

const char* Encrypt(char* strPValue)

  • 函数签名是否100%正确?还是缺少呼叫约定声明?(例如WINAPI、STDCALL)。不太可能是你问题的原因,但会让oyu陷入麻烦()
  • 例外情况是什么?告诉调试器在抛出异常时中断(在我的VisualStudio中,是调试/异常,启用“抛出”以…好吧,所有这些
  • 您可能使用了错误的API(但这只会在以后出现)
  • 输入字符串有效吗?是否对所有值都有效
您将看到类似“C++异常”或“访问冲突”的内容,以及其他诊断信息(如果幸运的话)

这种第一次出现的异常很有可能是“正常”的,也就是说,它总是发生在有效的输入中。但这种情况很少见,因为正常的执行路径不应该抛出异常


返回值:

如果返回值位于DLL内部的静态/内部缓冲区中(不需要释放),则卸载DLL时该值将无效

如果返回值由DLL动态分配(例如,DLL执行new[]或malloc或_tcsdup),则DLL还必须释放字符串,否则字符串将泄漏。不要释放调用方中的字符串,因为DLL和调用方可能使用或可能不使用不同的堆

检查DLL的文档,它应该说明谁需要释放返回的指针,以及返回指针的有效时间和/或有效时间。

  • 函数签名是否100%正确?或者是否缺少调用约定声明?(例如WINAPI、STDCALL)。这可能不是问题的原因,但会使oyu陷入麻烦()
  • 异常是什么?告诉调试器在抛出异常时中断(在我的Visual Studio中,它是调试/异常,启用“抛出”以…好吧,所有异常都是这样)
  • 您可能使用了错误的API(但这只会在以后出现)
  • 输入字符串有效吗?是否对所有值都有效
您将看到类似“C++异常”或“访问冲突”的内容,以及其他诊断信息(如果幸运的话)

这种第一次出现的异常很有可能是“正常”的,也就是说,它总是发生在有效的输入中。但这种情况很少见,因为正常的执行路径不应该抛出异常


返回值:

如果返回值位于DLL内部的静态/内部缓冲区中(不需要释放),则卸载DLL时该值将无效

如果返回值由DLL动态分配(例如,DLL执行new[]或malloc或_tcsdup),则DLL还必须释放字符串,否则字符串将泄漏。当DLL和调用者