dll返回类指针,在delphi里如何使用 ( 积分: 100 )

  • 主题发起人 主题发起人 deadeye
  • 开始时间 开始时间
D

deadeye

Unregistered / Unconfirmed
GUEST, unregistred user!
我这样写的
pTmyclass = ^Tmyclass;
...
var
p: pTmyClass ;
...
p:= getinst;
pTmyClass^.method;
它报EAccessViolation
 
我这样写的
pTmyclass = ^Tmyclass;
...
var
p: pTmyClass ;
...
p:= getinst;
pTmyClass^.method;
它报EAccessViolation
 
haha!跨进程传递对象本来就是很不那个的设计!

在C++里很容易,导出类结了!

你这个DLL的开发我估计也是Delphi,你得费些周折,使用一些inclue,abstract等等技术,在一本特厚的Delphi 开发人员指南上有这种样例。

良好的设计是通过COM构件,用接口。
 
我只有dll和接口说明
如果是自己设计的dll,就容易多了
 
在刘艺的面向对象一书中的第八章吧,好象就有提到这个问题,你去他的主页就可下到这一章节内容的PDF来看的
 
返回类的实例:
library SysSvr;


uses
ShareMem,
SysUtils,
Classes,
uISysSvr in 'uISysSvr.pas',
uSysSvr in 'uSysSvr.pas',
dmSys in 'dmSys.pas' {SqlServerDm: TDataModule},
HospitalConfigFrm in 'HospitalConfigFrm.pas' {HospitalConfigFrom},
SysSetParamsFrm in 'SysSetParamsFrm.pas' {SysSetParamsFrom},
AboutFrm in 'AboutFrm.pas' {AboutFrom},
Global in '../Global/Global.pas',
ChildFrm in '../Global/ChildFrm.pas' {ChildFrom};

{$R *.res}
function TObjSysSvr:TSysSvrClass;
begin
result:=TSysSvr;
end;
exports
TObjSysSvr;
begin
end.

unit uISysSvr;

interface
uses
Classes;
type
TISysSvr=class(TObject)
public
constructor Create(AHandle:THandle;const ExeFilePath:string)
virtual;abstract;
end;
TSysSvrClass=class of TISysSvr;
implementation

end.



unit uSysSvr;

interface
uses
Windows,Messages,Sysutils,variants,classes,DbClient,dmSys,
IniFiles,uISysSvr,StrUtils,forms,DB;
type
TSysSvr=class(TISysSvr)
private
public
constructor Create(AHandle:THandle;const ExeFilePath:string)
override;
destructor Destroy;override;
end;
 
不太一样,那个不是返回类
不像这个有create方法
它返回的实际上是一个实例的指针
我看过刘艺的书,和这里的情况不一样
 
参考一下这个问题,看看怎么用接口指针:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3154927
 
接口指针我也试过了
还是不行
这个dll是别人已经写好的
我不知道里面是怎么实现的
只提供了.h文件,我把.h文件翻译成了pas
 
你把H文件拿出来看看???
 
// MM.h
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_MM_H__00A7DDD1_0192_4B68_B9C2_8DDC9A8DC614__INCLUDED_)
#define AFX_MM_H__00A7DDD1_0192_4B68_B9C2_8DDC9A8DC614__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000


CMMDll* CreateInst();
void DeleteInst(CMMDll* pInst);


#endif // !defined(AFX_MM_H__00A7DDD1_0192_4B68_B9C2_8DDC9A8DC614__INCLUDED_)
 
啧,这我也看不懂,抱歉
 
CMMDLL不会是从CObject继承的吧,MFC专有的DLL不行
 
type
MMDll = class(TObject)
.....
end;
PMMDll = ^MMDll;
function CreateInst: PMMDll
stdcall
external 'MMDll.dll';
procedure DeleteInst(p: PMMDll)
stdcall
external 'MMDll.dll';
 
要使用VC的类,我记得是需要一个inc文件,里面定义对应的Delphi类,但是所有函数必须是纯虚的,而且C里面只能是非MFC类,也就是不能从CObject继承,在Delphi里面引用这个Inc文件就可以了
 
楼主看来是没有仔细看我提供的那个帖子了,这个问题说起来真的很简单的了,从你提供的两个输出函数来看VC中输出的应该是一个没有成员的抽象类(“没有成员的抽象类”就是接口了),在Delphi中也要声明成抽象类的(不能声明成接口);
你现在提供的信息太少,还有关于那个类的定义你没有贴出来,你的翻译正确与否也不得而知,想要尽早解决你的问题就不要让大家在这里猜谜了[:(][:(!]
 
那个dll是要保密的,还签了保密协议
所以我没办法贴出来给大家看
这里面MMDll就是我按照他和dll配套的.h翻译过来的
翻译的时候有什么要注意的么
我是按照一个c和delphi类型对照表翻的
 
我用返回来的指针,调用的是一个没有参数的方法
这个应该不存在翻译错的问题吧
 
多人接受答案了。
 
咱个解决的啊,说一下解决方法嘛
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部