求救:静态和动态库中 很奇怪的问题

evelan 2004-10-18 02:49:32
利用第三方的静态库,在VC中,用普通EXE程序调用编译,能正常工作,由于界面部分很多是Delphi开发的,故用VC把第三方静态库重新封装为动态库(DLL/OCX方式),好多函数都不能正常工作,请教各位,是什么原因造成的???
...全文
98 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
icelight 2004-10-19
  • 打赏
  • 举报
回复
如果是返回值不是期望值, 而不是函数出错, 那么问题可能和模块加载有关, 比如, 若你的静态库的函数执行这一句GetModuleFileName(), 若为动态库调用, 其结果就不一样.
Mr-Chen 2004-10-19
  • 打赏
  • 举报
回复
调用约定不一样,还有数据类型可能不同,注意Delphi和VC之间的数据转换,还有就是看看你的Def文件对不对,给你以下的参考:
Delphi中的声名格式:
Function ShowDialog( hMainWnd:THandle; Msg:PChar ):integer; stdcall;

输出到Dll文件中时,名称不分裂。

VC中的调用格式:
extern "C" __declspec(dllimport) int __stdcall ShowDialog( HWND hwnd,char* Msg );

.如带有__stdcall,则要求Lib文件中对应函数名称分裂,可有以下步骤生成Lib文件:

.用Impdef.exe生成def文件,格式为:Impdef def文件名 dll文件名

.手工调制def文件参数,如ShowDialog改为ShowDialog@8

.用Lib.exe生成lib文件,格式为:Lib /def:def文件名

.如声名中无__stdcall,默认调用格式仍为stdcall,但不要求名称分裂,用以下批处理文件MkLib.bat可生成Lib文件:

@echo off

if %1.==. goto error

impdef %1.def %1.dll

lib /def:%1.def

goto end

:error

echo Usage: MkLib DllName

echo Note: Don't add extension ".dll" to parameter "DllName"

:end

同时,如果别人的dll导出函数使用extern "C" __declspec(dllimport)而非_stdcall方式,那么你在VC中调用Delphi或者在Delphi中调用VC的dll几乎可以肯定的说不能成功,这时候你如果已知函数的原型,你需要使用与原来编写dll一样的语言自己再封装一层dll,把所有的接口都修改为_stdcall的方式,再来调用这个新的dll。
evelan 2004-10-18
  • 打赏
  • 举报
回复
我封装了3种方式都不行: 1) win32 Dll
2) mfc ActiveX
3) dcom 进程内服务

以上封装都是都是一样的错误!

如果不行,请问Delphi能调用VC的静态库么?
evelan 2004-10-18
  • 打赏
  • 举报
回复
我所说的函数出错,是指函数执行返回错误值,本来应该返回TRUE,但是封装以后调用返回了FALSE,只是函数不能正常工作,并不是函数调用就出错.

十分郁闷的问题
kugou123 2004-10-18
  • 打赏
  • 举报
回复
可能还是调用约定的问题。
evelan 2004-10-18
  • 打赏
  • 举报
回复
我想可能是我把问题没有描述清楚,第三方静态库(只能在VC中调用),在VC中可以调用编译,可以正常工作,然后把库封装成为Dll or OCX (以便于其他开发工具调用) 封装以后,就连VC调用封装后的动态库s时,静态库的好多函数都出错
oyljerry 2004-10-18
  • 打赏
  • 举报
回复
在vc和Delphi之间调用dll需要注意函数调用约定(多数是数据类型等在不同语言之间的差别),这个比较容易出错
evelan 2004-10-18
  • 打赏
  • 举报
回复
参数类型是一致的,所谓约定不一致应该和静态库无关吧,约定只和动态库中函数接口及声明有关系
快乐鹦鹉 2004-10-18
  • 打赏
  • 举报
回复
参数类型不一致,约定不一致等等
DentistryDoctor 2004-10-18
  • 打赏
  • 举报
回复
估计是调用约定或者是字符串的处理的问题。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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