在 Visual Studio 中使用 cygwin 编译的 dll 的库函数时出错
Posted
技术标签:
【中文标题】在 Visual Studio 中使用 cygwin 编译的 dll 的库函数时出错【英文标题】:Error using library functions of cygwin compiled dll in visual studio 【发布时间】:2016-06-13 12:00:51 【问题描述】:我正在尝试在 wisual studio 环境中调用 cygwin 编译的 dll。
如果我编译具有没有任何库的函数的 dll(只返回任何数字), 它工作正常,但如果我调用例如 stdio.h,并且写入文件的函数或只是 printf 函数,则不起作用(如果 printf 函数已退出代码 1536)。
#include <stdio.h>
int myfunc()
char* strtxt = "test";
FILE *hF = fopen( "Newlogtst.txt", "w" );
if(hF == 0)
return 5;
fputs( (const char*)strtxt, hF );
fclose(hF);
return 1;
int tst()
return 25;
function tst 工作正常,function myfunc 生成空文件Newlogtst.txt
并显示异常。
`
在 CygwinDlltest.exe 中的 0x6113333A (cygwin1.dll) 处引发异常: 0xC0000005:访问冲突读取位置0x004E0059。
如果有这个异常的处理程序,程序可能是安全的 继续。
` 在 Visual Studio 中,我正在使用此代码
#include <windows.h>
typedef int (*PFN_HELLO)();
typedef void (*PFN_CYGWIN_DLL_INIT)();
int main()
PFN_HELLO func;
HMODULE hLib, h = LoadLibrary(TEXT("C:\\cygwin\\bin\\cygwin1.dll"));
PFN_CYGWIN_DLL_INIT init = (PFN_CYGWIN_DLL_INIT) GetProcAddress(h,"cygwin_dll_init");
init();
hLib = LoadLibrary (TEXT("C:\\Cygwin\\home\\azatyan\\TestDynamicLink\\mydll.dll"));
func = (PFN_HELLO) GetProcAddress (hLib, "myfunc");
return func();
请帮助我应该如何使用库函数。
【问题讨论】:
functionmyfunc
no...._你能详细说明一下吗?
在继续之前阅读***.com/questions/1926311/cygwin-in-visual-studio
LPs:实际上它确实使Newlogtst.txt
文件为空,并退出并出现此异常-“在 CygwinDlltest.exe 中的 0x6113333A (cygwin1.dll) 处引发异常:0xC0000005:访问冲突读取位置 0x004E0059。如果有这个异常的处理程序,程序可以安全地继续。"
cup:谢谢,提供链接,但我认为这无济于事,我不想更改 Visual Studio 中的包含头路径,我想要的只是加载 dll,调用函数..
【参考方案1】:
-
你没有检查
GetProcAddress()
的返回码。
如果您在 C++ 中编译它,名称会以不同的方式错位,(这就是为什么 GetprocAddress()
将返回 NULL 顺便说一句。)因为它们是不同的编译器。
如果您只是使用示例中的基本功能,则应将它们声明为extern "C"
,以免它们被破坏。还要确保在编译 DLL 时正确使用了__declspec export
语句。
【讨论】:
没有函数名没有错位,我在调试GetprocAddress 不为NULL。它甚至使'Newlogtst.txt'为空文件...... 你读过这个吗? cygwin.com/faq/faq.html#faq.programming.msvcrt-and-cygwin 看起来您并没有真正正确地初始化 cygwin CRT。显然 cygwin_dll_init 是不够的。 谢谢,我想,我应该阅读如何正确初始化 cygwin CRT。但是我现在仍然不知道如何毫无例外地调用第二个函数? 从我通过谷歌找到的信息来看,不值得费心可能是不可能的或非常困难的。如果 CRT 正确初始化,我希望myfunc
不会再崩溃。以上是关于在 Visual Studio 中使用 cygwin 编译的 dll 的库函数时出错的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Visual Studio 2008 中打开使用 Visual Studio 2005 创建的 rdl?
我可以在 Visual Studio 2008 中使用 Visual Studio 6 编译的 C++ 静态库吗?