注册 登录
编程论坛 Delphi论坛

请教:delphi 调用vc++动态链接库问题

yby 发布于 2006-12-06 11:09, 1420 次点击

vc中声明
_declspec(dllexport) CString LLL(LPCTSTR filename)
并用1.def 中加上LLL变量,防止变量名改变
用vc++调用LLL没有问题
_declspec(dllimport) CString LLL(LPCTSTR filename);

delphi中调用
function LLL(filename:string):string;Stdcall; external '1.dll';

在执行aa:=LLL('d:\1.bmp');时出现错误:
Project Project2.exe raised exception class EAccessViolation with message 'Access violation at address 5F437BAO in module'mfc42d.dll'.Read of address 00000000'.Process stoped.

6 回复
#2
volte2006-12-07 09:46
module'mfc42d.dll'
调用出现问题!
可能是访问了没有创建的对象等等!!
#3
yby2006-12-07 17:53
#4
LEAN2006-12-08 12:19
volte 版主的的回答不负责任。

vc中声明:
_declspec(dllexport) CString LLL(LPCTSTR filename)
很明显VC里面导出的是CString类型。CString是MFC的类,在Delphi里面肯定不可能直接拿来应用。

解决方法是:

1.在VC中将LLL重新包装一次,且返回LPCSTR
LPCSTR _LLL(LPCTSTR AFileName)
{
return LLL(AFileName).GetBuffer;
}

2.重新导出 _declspec(dllexport) LPCSTR _LLL(LPCTSTR filename);
3.Delphi调用 function _LLL(AFileName: PChar): PChar; stdcall; external '1.dll';
#5
volte2006-12-08 14:16

想起来了,CString是VC中的MFC类,
有段时间没接触VC了
我一开始当作是简单的函数返回字符类型

#6
volte2006-12-08 14:32
用COM思想可以实现。不过这种方法就要楼主更改DLL了!
Class A{
public:
void Function();
}
Class B{
public:
virtual void _cdecl Function();
privated:
A* aa;
}
void B:B()
{
aa=new A;
}
void B::Function()
{
aa->Function();
}
extern "C" __declspec(dllexport) B* GetBClass(){
return new B;
}

在Delphi中
type
B=class
procedure Function cdecl;virtual;abstract;
end;

function GetBClass:B cdecl;external 'my.dll';
//
var
bb: B;
begin
bb:= GetBClass;
bb.Function();
end;

//---------------------------------------------------------------------------
#7
yby2006-12-14 10:40
感谢各位的帮忙,后来改用mfc静态库就正常了
1