在MTS中如何正确地使用动态函数调用 (急急急!)(300分)

  • 主题发起人 主题发起人 chrisn
  • 开始时间 开始时间
C

chrisn

Unregistered / Unconfirmed
GUEST, unregistred user!
在接口中定义函数
procedure QryItf(const aInCode: WideString;
var aDataSet,
aError: OleVariant);
safecall;
aInCode : 是客户机传过来的调用函数名;
aDataSet : 是回传给客户机的数据集
aError : 是返回调用中的出错信息
type
TProc = Procedure(AObj: TObject;
var aDataSet, aError: OleVariant);
procedure TmtsTest.QryItf(const aInCode: WideString;
var aDataSet,
aError: OleVariant);
var
InCodeObj : TInCode;
InCodeAddr : Pointer;
aProc : TProc;
begin
InCodeObj := TInCode.Create;
try
InCodeAddr := InCodeObj.MethodAddress(aInCode);
aProc := TProc(InCodeAddr);
aProc(nil, aDataSet, aError);
finally
InCodeObj.Free;
end;
end;

另建了个函数集合单元 CodeSrv
type
TInCode = Class(TObject)
published
procedure QueryTestTbl(var aDataSet, aError: OleVariant);
end;

procedure TInCode.QueryTestTbl(var aDataSet, aError: OleVariant);
begin
try
dm.ADOConnection1.Open;
dm.ADOQuery1.SQL.Clear;
dm.ADOQuery1.SQL.Add('select * from table1');
dm.ADOQuery1.Open;
dm.ClientDataSet1.Open;
aDataSet := dm.ClientDataSet1.Data;
aError := 'OK!';
finally
dm.ADOConnection1.Close;
end;
end;

dm 是引用的数据模, 程序调试时可以正确找到要调用的函数,
但一执行到数据模块引用就报错,客户端报"灾难性错误!"
不知道为何
 
大侠请不吝赐教
 
InCodeObj := TInCode.Create;
try
InCodeAddr := InCodeObj.MethodAddress(aInCode);
aProc := TProc(InCodeAddr);
aProc([red]InCodeAddr[/red],aDataSet, aError);
finally
InCodeObj.Free;
end;
注意红色处代码,类里面的方法都会有一个默认的参数,也就是类实例指针(InCodeAddr),
你传nil当然会报错了,等于呼叫 nil.QueryTestTbl,你说会不会错呢??[:)]
 
你错理解意思了
aProc := TProc(InCodeAddr)
已经取到函数地址了, aProc(nil, aDataSet, aError);
是正常调用
该实例在DCOM/SOCKET环境中已经运行通过,只是转到MTS不行了
而且断点显示已经进入了QueryTestTbl函数,只是在调用数据模块时引起错误
 
直接回传数据集在midas和mts中好像都行不通
反正我没成功过
最好放到一个动态数组中完事
 
这完全可以,关键是调用的问题
 
为什么老有一大堆人放着实际问题不管
老在那讨论哪个软件好,哪个软件差
大家多点专研精神不行吗,发现BUG,牛B你改去啊
在那发牢骚有什么用,用UNIX + C++不是也一样会出这样那样的问题
 
高手们请教啊
都到哪里去了
 
你还是传 TClientDataSet.Data过来吧,这个没问题
另外你说DCOM/Socket成可能是因为COM+对象第次在
调用接口时创建在返调用时释放有关,COM+对象实例
的生存期很短.第次方法调用都会重新创建和释放
 
看了你的代码,应该没有什么问题。
既然是执行到DM的地方报错,
那么进入你的函数QueryTestTbl时,dm是否已经创建出来了呢?
如果你跟踪一下程序,进入函数后,dm本身是不是nil?
 
后退
顶部