mingw生成的DLL,用mingw的App调用没有问题,但是用vc调用的时候出现异常

iorikingdom 2008-12-19 09:51:56
mingw生成的DLL,用mingw的App调用没有问题,但是用vc调用的时候出现异常
vc调用的时候,有个别函数调用出异常,看异常内容应该是指针越界,有些函数函数又很正常
这个会是什么方面的出的问题?百思不得其解
...全文
294 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
violetvisy 2011-02-27
  • 打赏
  • 举报
回复
到底是怎么解决的?
iorikingdom 2008-12-24
  • 打赏
  • 举报
回复
确实是这个问题!谢谢redleaves兄
iorikingdom 2008-12-22
  • 打赏
  • 举报
回复
有这个可能,晚上回去试试
谢谢movdqa兄
redleaves 2008-12-20
  • 打赏
  • 举报
回复
如果是movdqa xmm3,xmmword ptr [ecx+10h] 出错,那是因为对齐的原因,
movdqa要求数据16字节对齐,否则就会有内存访问错误.
你可以看一下出错的时候ecx的最后4位是不是0.如果不是,那肯定是要出错的.
如果把movdqa改成下面那种movdqu,就可以避免这个错误.只是会慢一点点.
redleaves 2008-12-19
  • 打赏
  • 举报
回复
给出函数声明看看.
iorikingdom 2008-12-19
  • 打赏
  • 举报
回复
还是不行,把参数去掉了,某个函数,还是异常。。。。
除非这个函数只是输出简单的hello world就可以
iorikingdom 2008-12-19
  • 打赏
  • 举报
回复
断在sse指令相关的地方

6AB394D8 movdqa xmm3,xmmword ptr [ecx+10h]
6AB394DD movdqu xmm2,xmmword ptr [ecx+11h]
6AB394E2 movdqa xmm1,xmm3
6AB394E6 pslldq xmm1,1
6AB394EB movdqa xmm4,xmm1
6AB394EF pavgb xmm1,xmm2
iorikingdom 2008-12-19
  • 打赏
  • 举报
回复
把stdcall改了,加了个编译选项把@去掉
-Wl,--kill-at,可以在找到符号load进去了
但是还是在vc的时候跑了异常了
在mingw里面正常跑,好像也不是cpp和c的问题,我两个方式也都试过了,真郁闷啊,搞了一周都没有找到原因
redleaves 2008-12-19
  • 打赏
  • 举报
回复
应该是调用约定的问题.
你要在导出函数的声明中明确调用约定.这样才能保证接口的二进制兼容性.
比如:
extern "C" __declspec(dllexport) void __stdcall foo(int,char);
其次,导出函数的参数也要仔细考虑,有些类型的数据,不同的编译器编译出的结果不同,并不一定是二进制兼容的.
once_and_again 2008-12-19
  • 打赏
  • 举报
回复
动态库只有c的函数接口,
如果要cpp来调用,要封装成cpp的代码。
redleaves 2008-12-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 iorikingdom 的回复:]
不行啊,我改成 stdcall连函数指针都找不到了,
mingw和vc应该都是默认__cdecl的吧
[/Quote]
改成stdcall不是找不到,是你的方法不对.
如果你不指定.def,那所有的导出名称都是符号的名称.stdcall的符号会变成_XXX@n这种
你在LOAD时,名称要改一下.具体的名称可以用Dependency工具来看.
如果你想用固定的名称,那请在导出符号表(.def文件)里设置.
至于编译器的默认调用约定,这个是不确定的.依环境和参数而变.你还是明确定义才对.在使用的时候也一样.
sxqlyy 2008-12-19
  • 打赏
  • 举报
回复
在MinGW. d e f文件

EXPORTS
TestFunction
试试看
tanmeining 2008-12-19
  • 打赏
  • 举报
回复
看了你的要求,好像是要动态加载很多函数?能换成静态加载不?
iorikingdom 2008-12-19
  • 打赏
  • 举报
回复
不行啊,我改成 stdcall连函数指针都找不到了,
mingw和vc应该都是默认__cdecl的吧
lbh2001 2008-12-19
  • 打赏
  • 举报
回复
都使用stdcall的调用约定
iorikingdom 2008-12-19
  • 打赏
  • 举报
回复
MinGW方面

#define BUILD_DLL
#ifdef BUILD_DLL
/* DLL export */
#define EXPORT __declspec(dllexport)
#else
/* EXE import */
#define EXPORT __declspec(dllimport)
#endif

void EXPORT TestFunction()
{
int i=0;
for( i=0;i<4;i++)
{
//printf("pInput[%d]:%d\n",i,pInput[i]);
};

ENCODE_PARAM EncodeParam;
EncodeParam.nGop = 8;
EncodeParam.iHeight = 176;
EncodeParam.iWidth = 240;
EncodeParam.nBitRate = 80000;
EncodeParam.nFrameRate = 8;



ENCODE_CONTEXT *pEncodeContext = H264Init(&EncodeParam);
H264Encode(pEncodeContext);

printf("Hello Dll");

};




VC方面

typedef void (* TF)();

// TODO: 在此处为应用程序的行为编写代码。
HMODULE hDll = ::LoadLibrary ("E:\\MyProgram\\CDT\\TestDLL\\Debug\\libTestCDT.dll");
TF TestFunction = (TF)::GetProcAddress (hDll,"TestFunction");
TestFunction();
FreeLibrary (hDll);

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧