Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.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
LoadLibrary-在C+中正确清理+; 我在C++ Visual Studio 2012中有一个小代码,用于调用CygWin从DLL文件构建静态函数,下面的代码完全工作。问题是,有时它在函数调用时崩溃,或者像通常那样将结果值输出到控制台,但VisualStudio中的调试器并没有向前推进。奇怪的行为。我想我退出应用程序后可能没有正确清理?我第一次加载VS时,它可以工作,但在一些调试和崩溃之后,这种情况开始发生 PFN_HELLO fnHello; HMODULE hLib, h = LoadLibrary(TEXT("cygwin1.dll")); PFN_CYGWIN_DLL_INIT init = (PFN_CYGWIN_DLL_INIT) GetProcAddress(h,"cygwin_dll_init"); init(); hLib = LoadLibrary (TEXT("cyghello.dll")); if (NULL == hLib) { DWORD _err = GetLastError(); //return 1; } //typedef LRESULT (WINAPI *PFN)(HWND, UINT, WPARAM, LPARAM); // PFN MySendMessageW; //MySendMessageW = (PFN) GetProcAddress(hLib,"runMainRoutine"); fnHello = (PFN_HELLO) GetProcAddress (hLib, "runMainRoutine@4"); if (NULL == fnHello) { DWORD _err = GetLastError(); //return 1; } char* _bablabla = fnHello(_input); FreeLibrary(h); FreeLibrary(hLib); return _bablabla;_C++_Visual Studio 2012_Loadlibrary_Resource Cleanup - Fatal编程技术网

LoadLibrary-在C+中正确清理+; 我在C++ Visual Studio 2012中有一个小代码,用于调用CygWin从DLL文件构建静态函数,下面的代码完全工作。问题是,有时它在函数调用时崩溃,或者像通常那样将结果值输出到控制台,但VisualStudio中的调试器并没有向前推进。奇怪的行为。我想我退出应用程序后可能没有正确清理?我第一次加载VS时,它可以工作,但在一些调试和崩溃之后,这种情况开始发生 PFN_HELLO fnHello; HMODULE hLib, h = LoadLibrary(TEXT("cygwin1.dll")); PFN_CYGWIN_DLL_INIT init = (PFN_CYGWIN_DLL_INIT) GetProcAddress(h,"cygwin_dll_init"); init(); hLib = LoadLibrary (TEXT("cyghello.dll")); if (NULL == hLib) { DWORD _err = GetLastError(); //return 1; } //typedef LRESULT (WINAPI *PFN)(HWND, UINT, WPARAM, LPARAM); // PFN MySendMessageW; //MySendMessageW = (PFN) GetProcAddress(hLib,"runMainRoutine"); fnHello = (PFN_HELLO) GetProcAddress (hLib, "runMainRoutine@4"); if (NULL == fnHello) { DWORD _err = GetLastError(); //return 1; } char* _bablabla = fnHello(_input); FreeLibrary(h); FreeLibrary(hLib); return _bablabla;

LoadLibrary-在C+中正确清理+; 我在C++ Visual Studio 2012中有一个小代码,用于调用CygWin从DLL文件构建静态函数,下面的代码完全工作。问题是,有时它在函数调用时崩溃,或者像通常那样将结果值输出到控制台,但VisualStudio中的调试器并没有向前推进。奇怪的行为。我想我退出应用程序后可能没有正确清理?我第一次加载VS时,它可以工作,但在一些调试和崩溃之后,这种情况开始发生 PFN_HELLO fnHello; HMODULE hLib, h = LoadLibrary(TEXT("cygwin1.dll")); PFN_CYGWIN_DLL_INIT init = (PFN_CYGWIN_DLL_INIT) GetProcAddress(h,"cygwin_dll_init"); init(); hLib = LoadLibrary (TEXT("cyghello.dll")); if (NULL == hLib) { DWORD _err = GetLastError(); //return 1; } //typedef LRESULT (WINAPI *PFN)(HWND, UINT, WPARAM, LPARAM); // PFN MySendMessageW; //MySendMessageW = (PFN) GetProcAddress(hLib,"runMainRoutine"); fnHello = (PFN_HELLO) GetProcAddress (hLib, "runMainRoutine@4"); if (NULL == fnHello) { DWORD _err = GetLastError(); //return 1; } char* _bablabla = fnHello(_input); FreeLibrary(h); FreeLibrary(hLib); return _bablabla;,c++,visual-studio-2012,loadlibrary,resource-cleanup,C++,Visual Studio 2012,Loadlibrary,Resource Cleanup,对于任何从DLL静态函数返回char*的人,您必须在应用程序(调用者)中分配char[],而不是在DLL中分配。我注意到一件事。将外部dll中的uu stdcall更改为u cdecl显著改善了这种情况,但仍然经常失败。问题到底发生在哪一行?还有,什么是巴巴拉?以后是否要删除此指针?它是指向dll中某些静态数据的指针吗?在我看来,您使用它是错误的,因为即使它是动态分配的,dll也可能使用它自己的堆,因此您需要从dll中取消分配它。如果它不是动态分配的,在卸载dll时使用它会导致各种问题;FNHh

对于任何从DLL静态函数返回char*的人,您必须在应用程序(调用者)中分配char[],而不是在DLL中分配。

我注意到一件事。将外部dll中的uu stdcall更改为u cdecl显著改善了这种情况,但仍然经常失败。问题到底发生在哪一行?还有,什么是巴巴拉?以后是否要删除此指针?它是指向dll中某些静态数据的指针吗?在我看来,您使用它是错误的,因为即使它是动态分配的,dll也可能使用它自己的堆,因此您需要从dll中取消分配它。如果它不是动态分配的,在卸载dll时使用它会导致各种问题;FNHhello是dll中的函数,它打开一些文件,进行一些计算,并返回char*。它被定义为:char*uu declspec(dllexport)uu cdecl runmain例程(char u inputString2[]),因此我也需要清理dll内部的一些内容?我应该稍后删除char*Baballa点?嗯。如果我卸载dll,它不也会释放这些数据吗?它不是静态的。它在函数中定义为char*finalResult;它可能正在删除指针,也可能依赖于您来删除它。在任何情况下,问题都是在卸载dll后返回要使用的指针。好的经验法则(与
中类似于
std::fgets
的函数签名结合使用),但除非我忘记了dll的一些重要内容,否则它不一定是必需的。如果是单线程应用程序,或者有某种锁定机制,或者保证指向的数据永远不会更改,那么返回指向函数定义中声明的静态数组的指针(或者以其他伪全局方式)应该是安全的。