COM接口函数调用问题 (100分)

  • 主题发起人 主题发起人 xiaolinj79
  • 开始时间 开始时间
X

xiaolinj79

Unregistered / Unconfirmed
GUEST, unregistred user!
使用ActiveX Labrary作为容器,添加一个COM Object
并新增一个DataModule放入ADOConnection以及ADOQuery连接SQLServer2000数据库
在COM部件的接口中添加接口函数login,其代码如下
function TMyDllServer.Login(const UserID, Psw: WideString): OleVariant;
var
sSQL:string;
begin
sSQL:='select * from Tbl_UseHead where UserID='''+UserID+''' and PssW='''+Psw+'''';
with DataModule2.ADOQuery1do
begin
Close;
SQL.Clear;
SQL.Add(sSQL);
Open;
if RecordCount=0 then
result:=0
else
Result:=1;
end;
end;
然后做一个测试程序,就一个按钮用来调用这个函数,输出返回值
运行出错,提示为
Access violation at address 00FDE50A in module 'MyComServer.dll'.
Read of address 0000005C.
使用测试程序调试dll,单步执行出错语句停在
with DataModule2.ADOQuery1do
这一句
想问一下各位高手,是不是在COM方式中不能使用DataModue?
如果是这个原因,那么该如何在COM的函数中完成修改数据库内容的sql语句?
帮写个例子完成上面函数的功能即可,万分感谢啊!不,是100分感谢:)
这100分可是我刚赚来的:(
 
最主要的是,我要完成用ASP来调用这个方法
在ASP中提示灾难性失败
而用ASP调用带SQL语句的函数,使用到DataModule里的ADOCONNECTION的都是这个错误提示
想搞清楚,如果有人用过使用ASP作为客户端的分布式开发实例
想和他交流一下
联系方法,QQ:28575640,mail:ghostxiaolinj@163.com
 
ExecSQL不返回结果,Open才会返回结果,EexecSQL后调用RecordCount是否有问题,
试试把ExecSQL注释掉。
 
出错的地方停在with语句,都还没有执行到EexecSQL
唉,在线等待真痛苦啊:(
 
up一下,怎么没有人回答啊,难道分给得少?
sigh
 
在Com对象中使用重载如下方法
TMyDllServer = class(...
public
procedure Initialize;
override;
end;
procedure TMyDllServer.Initialize;
begin
inherited;
if not Assigned(DataModule2) then
DataModule2 := TDataModule2.Create(Self);
end;

另外,同意wind的说法
 
to:szf
ExecSQL我已经修改了
但是Com对象中使用重载DataModule时出错,提示如下
Incompatible types:'TComponent' and 'TMyDllServer'
错误不知如何解决,望提示一下,谢谢
 
这个很难看出来的,除非你贴多点出来罗
你可把源码发到zqszf@21cn.com,编译问题很快就可以解决。
 
to szf
我的源码很简单,没有完成什么功能,只是一个简单的查询表语句
已经发到你的mail了。
如果解决不了,麻烦你帮我做一个简单的测试程序
用ActiveX Labrary作为容器,添加一个COM Object
并新增一个DataModule放入ADOConnection以及ADOQuery连接SQLServer2000数据库
不用写其他的东西,只要在客户程序中能调用服务程序中使用了DataModule的
无任何实际功能的函数吗?拜托了,星期一等着用呢!!!
 
程序结构改好了,逻辑和功能没看。
 
发回给我了吗?
万分感激!
呵呵
 
很简单嘛。你使用TADOQuery有问题。
使用TADOQuery执行Select的SQL语句时,应该使用Open方法,只有在执行没有返回值的SQL语句
(Insert,Update)时,才使用ExecSQL方法。
所以你那一段应该改称:
Close;
SQL.Clear;
SQL.Add(sSQL);
Open;
不要执行ExecSQL方法。
同时还要注意,对于同一个TADOQuery对象实例,不能同时执行这两种类型的SQL语句,
否则肯定会出错的。
 
好的,我回去测试一下程序,如果是这个问题那我就是笨死了!!!
 
测试结果,肯定不是ExecSQL和Open的问题
还是怀疑是COM中使用DataModule的问题
谁能告诉我正确的COM中使用DataModule的方法
100奉送
要求
ActiveLibrary+COM Object+DataModule+ADOConnection+ADOQuery
接口方法直接对单表操作即可
如果这个模式不行,告诉我ActiveLibrary+COM Object下操作数据库的构造结构
急!!!
 
程序还不行吗?这次是又什么错误了?
 
你没有把代码发给我啊,我还不知道怎么解决啊
把你改过的程序发还给我看啊!
 
早就发了呀。
又没有拒收,还以为你收到了呢。
再查吧,收不到换个信箱。
 
难怪,我说怎么……
hot.kiss.me@163.com
wuqiang_2@hotmail.com
 
DataModule2在客户连接COM时并未Create!
借szf代码:
TMyDllServer = class(...
private
FDataModule: TDataModule2;
public
procedure Initialize;
override;
destructor Destroy;
override;
end;
...
procedure TMyDllServer.Initialize;
begin
inherited;
FDataModule := TDataModule2.Create(Self);//不要用全局变量DataModule2,一个客户一个实例呢
end;

procedure TMyDllServer.Destroy;
begin
FDataModule.Free;
Inherited;
end;

建议用Remote Data Module!DELPHI会帮你搞定的!
 
hotmail那个已经拒收了,不知道其它怎么样
 
后退
顶部