当前位置:  技术问答>linux和unix

VS中调用c在cygwin生成的dll,出现了调用崩溃

    来源: 互联网  发布时间:2017-05-30

    本文导语:  大家好,我现在有个问题,苦苦折腾了几天,还没解决,因此上来寻找知道问题的高手,先感谢所有进入看帖的人,下面进入正文: 我现在有个需求,需要将linux下的c程序作成dll,提供给windows平台的vs程序调用,代...

大家好,我现在有个问题,苦苦折腾了几天,还没解决,因此上来寻找知道问题的高手,先感谢所有进入看帖的人,下面进入正文:
我现在有个需求,需要将linux下的c程序作成dll,提供给windows平台的vs程序调用,代码实现跨平台。

一、采用的方式是:通过cygwin把c代码生成dll文件,然后在vs2005中动态载入dll,调用接口函数,具体做法如下:

1、cygwin中生成dll:
1) gcc -c mytest.c
2) gcc -shared -o mytest.dll mytest.o

2、mytest.dll和cygwin1.dll放到vs2005工程目录。
3、vs2005中调用(工程为MFC对话框工程):
  
1) 导入cygwin1.dll,初始化:
// code1:
//文件头部定义代码:
HMODULE h;
typedef int(*PFN_CYGWIN_INIT)();

// 工程入口载入cygwin1.dll
h = LoadLibrary(TEXT("cygwin1.dll"));
PFN_CYGWIN_INIT init = (PFN_CYGWIN_INIT)GetProcAddress(h, "cygwin_dll_init");
init();

2) 在工程需要的地方调用dll的方法,代码如下(FreeLibrary没写出来):
// code2:
//文件头部定义代码:
HMODULE hLib;
typedef int(*PFN_TIME)(int a, int b);
PFN_TIME getTime;

// 某个方法内调用
hLib = LoadLibrary(TEXT("mytest.dll"));
getTime = (PFN_TIME)GetProcAddress(h, "Add_func");
long t = getTime(3, 5);

二、出现的问题:
1、code2紧跟在code1后面,程序正常调用,没有问题,code2放在工程中别的位置,有的地方可以,有的地方不行(貌似越靠程序流程前面,调用就会正常)。
2、现象:出问题的时候,有两种现象,他们是我把调用代码放在不同的地方出现的:一种是dll能正常调用,但发现在LoadLibrary之后,当前类的指针this就变成了0x00000000,退出当前函数,程序就崩溃;另一种情况是调试的时候,跟到long t = getTime(3, 5);这一行,程序就没有了反应,好像在里面出不来了,没往下执行了。

三、尝试过的方法:
1、官方说“Make sure you have 4K of scratch space at the bottom of your stack”,所以我在vs中也做了设置:“项目”属性->配置属性->链接器->系统,堆栈保留大小和堆栈提交大小设成了2097152和4096,对应十六进制100000,1000,这个值是经dumpbin /HEADERS mytest.dll查到的。
2、也试过在编译dll的时候在gcc中设置了上面的值,但也无济于事。

猜测:
1、“4K of scratch space”很可能是一个原因,但是不太清楚是否是这样设置;
2、会否是因为对话框程序在切换对话框后另启了一个线程,导致无法读到原来堆栈的bottom信息;
3、编译dll的时候是否还有别的option要加,因为奇怪的是:如果我的dll里面是一个简单的加法运算的方法,程序调用是完全没有问题的!但是我的dll源文件里面加入了用来做一个获取当前时间的方法,程序调用就出现了本文的问题。

希望在这里有缘碰到刚好在这方面有经验的朋友给予赐教,感谢你花时间看我的问题!

|
Hey gey! 
I've ever encountered the problem like you,eventually I resolved it. I benefit from the website as: http://blog.csdn.net/null_shadow/article/details/1807797
Mind that:you should keep the stackbase alive,so that everytime you call the dll,you have the stack called, assembler would help you!
Best luck!

|
what if you isolate the method having the function call defined in sys/time.h? will it crash as well?

    
 
 

您可能感兴趣的文章:

  • 关于JAVA调用linux命令 生成密钥对的问题
  • Java能调用OLE对象吗?怎样利用Java生成Excel报表?
  • 请问VC生成的控件怎么在JAVA里面调用,就是显示在网页上,里面的方法可以实现?
  • java可以调用windows api吗,用jbuild 可以生成.exe文件吗,散分,高手出招
  • c++生成dll使用python调用dll的方法
  • gcc编译生成的 libmynet.so库中的函数没法调用,不知道为什么,好心人帮帮忙啊!!
  • Android调用google地图生成路线图实现代码
  • 简单小问题,指点迷津。不是一个包中类可以不引用随便调用么?我在jb使用中,用自己做的类生成对象,怎么说找不到?
  • C#调用Matlab生成的dll方法的详细说明
  • php调用google接口生成二维码示例
  • JAVA 程序中要调用另一个我本人生成的类文件,此时javac怎么用?
  • C++生成dll和调用dll的方法实例
  • php调用google接口生成二维码实例
  • [急切求助]生成和调用.a文件问题。。。
  • linux 下,如何生成一个.o文件,该文件还调用一个.o文件或.a文件,请问该怎么写命令呢?
  • device_create一调用就崩溃
  • Linux下多线程程序崩溃时如何提取出所有线程的函数调用栈
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 在Python中使用SWIG调用C和C++程序
  • Linux添加系统调用时如何调用C语言库函数
  • sessionbean调用entitybean的时候还需要像Client一样远程调用对象吗??
  • system()调用 与 ioctl()调用
  • linux 下,如何生成一个.o文件,该文件还调用一个.o文件或.a文件,请问该怎么写命令呢? iis7站长之家
  • 如何在LINUX下用一个普通文件调用一个自己编写的调用系统的文件
  • 可不可以用java调用其他语言的编译结果?(好象asp调用com那样)
  • 为什么我的BEAN 在WIN2000中调用没有问题,但在LINUX中调用有问题
  • 为什么守护进程调用调用getlogin会失败呢?
  • 用RMI进行远程对象调用的时候,可不可以实现多个调用远程对象的并发操作
  • 关于jsp调用javabean的问题!调用是成功了,但是有小问题!
  • ioctl中能不能调用generic_file_read呀?我一调用就不动了
  • LINUX下系统调用是不能中断的,要怎么改造成可以中断系统调用?
  • 请问用javaScript或vbScript可否调用页面上Applet的public函数?如何调用?
  • 请问在jsp中调用外部的类,与jsp调用javabean有何区别??
  • 调用数学函数,需要调用哪个函数库?
  • 调用system(“命令”)和函数调用之间有什么不同?效率?
  • 请问如何在Java中调用一个VB所写的DLL?如何调用这个Dll的方法?如何取得和设置这个Dll的属性值?谢谢!
  • 脚本1调用脚本2,脚本2必须输入回车,如何在调用过程中自动输入回车
  • 请问linux中的系统调用号是如何跟系统调用表对应起来的
  • 我的APPLET在Jbuilder5中,可以调用EJB对象,但是移植到网页上却不能调用EJB对象!是何缘故,值得研究!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3