如何在Dll中调用DataModule? 哪位高人可以指点一下? to : Shd, rester 到目前为止,整个Delphi世界只有你们二位知道

  • 主题发起人 主题发起人 zyx1122
  • 开始时间 开始时间
我也需要关注,那是我从别的地方摘录的,我没这么写过。
 
to:ugvanxk
你从哪里看到的?
 
同是天涯沦落人. 我也让dll的datamodule搞的头大.
不过你用 m_dm := TdmClient.Create(nil)可以了,记得在退出时free掉.
 
m_dm := TdmClient.Create(nil)
程序运行到这里就出错。
 
可不可以把你们的代码共享一下?
多谢!
 
在unit uDMC;里的最后加入如下的语句:
initialization
begin
OleInitialize(nil);
end;

finalization
begin
try
OleUninitialize;
except
end;
end;

//另外在uses 里加入 activex,单元
 
刚试了一下, 还是一样出错
是不是还有其他地方我没有改?
 
unit uDMC;
interface
uses
SysUtils, Classes, DB, ADODB, Dialogs, DBClient, MConnect, activex;
type
TdmClient = class(TDataModule)
conn: TDCOMConnection;
cdsVehicle: TClientDataSet;
cdsVehicleLAST_NAME: TStringField;
private
{ Private declarations }
public
end;

var
dmClient: TdmClient;
implementation
{$R *.dfm}
initialization
begin
OleInitialize(nil);
end;

finalization
begin
try
OleUninitialize;
except
end;
end;

end.
 
to : Shd, rester
到目前为止,整个Delphi世界只有你们二位知道如何解决此问题。
你们可不可以解释的详细一些?
 
把你的出错信息贴出来,还有单步执行,看走没走OleInitialize(nil);
实在不行把程序发过来——shd@hanwang.com.cn
 
程序走到OleInitialize(nil);
我已经把代码发给你了。
 
一份是rar
一份是winzip
 
收到了,你简单说明一下。
 
你是D6?
我是D5,看不了。
把你的出错信息贴出来,我在去有D6的机器上看看。
现有急事,4:00左右再看你的问题。
 
先不用理EtyClass
//////////////// 创建TCtlVehicleInOut ///////////////////////////////
library CtlVehicleInOut;
{$R *.res}
function CtlVehicleInOutClass : TCtlVehicleInOutClass;
begin
result := TCtlVehicleInOut;
end;
exports
CtlVehicleInOutClass;
////////////////////////////// 定义接口ICtlVehicleInOut ////////////////////
unit ICtlVehicle;
interface
uses
classes,
IEtyVehicle;

type
ICtlVehicleInOut = class;
TCtlVehicleInOutClass = class of ICtlVehicleInOut;
ICtlVehicleInOut = class
protected
public
constructor Create;
virtual;
procedure test();
virtual;
abstract;
end;

implementation
{ ICtlVehicleInOut }
constructor ICtlVehicleInOut.Create;
begin
inherited;
end;

/////////////////////////////// 实现接口 uImpCtlVehicle ////////////
unit uImpCtlVehicle;
interface
uses
IEtyVehicle,
ICtlVehicle,
Classes,
SysUtils,
uDMC,
Dialogs;
type
TCtlVehicleInOut = class(ICtlVehicleInOut)
private
m_dm :TdmClient;
public
constructor Create;
override;
procedure test();
override;
end;

implementation
{ TCtlVehicleInOut }
constructor TCtlVehicleInOut.Create;
begin
inherited;
ShowMessage('TCtlVehicleInOut.Create');
m_dm.Create(nil);
if (m_dm = nil) then
ShowMessage('m_dm is null')
else
ShowMessage('m_dm is ok');
end;

procedure TCtlVehicleInOut.test();
var
strCard_No : string;
begin
ShowMessage('etyVehicleInOut.Card_No');
m_dm.conn.AppServer.LoadData(dmClient.cdsVehicle.ProviderName, 'Clients', '');
strCard_No := m_dm.cdsVehicleLAST_NAME.AsString;
ShowMessage(strCard_No);
end;

end.
 
Exception EOLESysError in module Vcl50.bpl at 001A321.
没有注册类别。
以上是在D5里编译时的提示。
在D6里uImpCtlVehicle的单元里,引用uDMC处,按住CTR点鼠标(跳转连接)时,提示
无法写入注册表项。
所以你应该重新做一个uDMC,我已经不知道错误出在什么地方了。
constructor TCtlVehicleInOut.Create;
begin
inherited;
ShowMessage('TCtlVehicleInOut.Create');
m_dm.Create(nil);//是错误的。应该写成m_dm := TdmClient.Create(nil);
//不知道你要做什么,注意释放时先释放m_dm。

if (m_dm = nil) then
ShowMessage('m_dm is null')
else
ShowMessage('m_dm is ok');
end;



 
真是可恶,我都不知道什么时候写错了
m_dm.Create(nil);
改过来就好了。
谢天谢地,多谢Shd!
多谢各位!
剩下的问题我慢慢解决。
 
好像搞得太复杂了。其实很简单,在你的Dll的文件中use Forms 单元。然后用Application
.CreatForm就可以了。
 
to:huazhb
愿闻其详
 
http://www.delphibbs.com/delphibbs/DispQ.asp?LID=1354567
关注一下吧没有人提起来呀!用MODEM打电话利用PC机的耳机和麦克风,自己编程如何实现?
(我知道有现成的软件可以用,但是我想自己实现这个上东西)
QQ:65466700
MAIL: along@b2sun.com
TEL :13802785865
http://b2sun.com
请各位大侠多多指教!
 
后退
顶部