S
solaray
Unregistered / Unconfirmed
GUEST, unregistred user!
使用Delphi编写一个ActiveX DLl
Dll是发布一个接口从外界获取一个Connection
然后在内部创建一个Recordset使用这个外部的Connection
ASP代码:
结果发现在ASP调用COM下运行正常,一旦将组件放入COM+即报错:
[red]0x800A0BB9 "Arguments are of the wrong type, are out of acceptable range,or are in conflict with one
another."[/red]
我的分析:
ADO的Connection以及Recordset无法跨进程使用
本例中的Connection由ASP创建,位于一个叫做IIS Out-Of-Process Pooled Applications的COM+程序内(某个Dllhost.exe进程)
在COM环境下,我的组件是进程内dll,和该ASP - COM+程序位于同一个dllhost.exe内,所以正常
一旦部署入COM+成为一个独立的Application,组件位于另外一个独立的Dllhost.exe内
所以出错了
请问我的分析正确吗?
另外我现在的解决办法是写一个另外的ConnectionFactory组件,跟随我的组件部署于同一个Application内提供
connection,就运行正常了。
请问还有无更好的办法?
附上全部代码:
Dll是发布一个接口从外界获取一个Connection
然后在内部创建一个Recordset使用这个外部的Connection
ASP代码:
代码:
Set CN = Server.CreateObject("ADODB.Connection")
CN.CursorLocation = 3
CN.Open DB_STRING
Set ConnObj = Server.CreateObject("ZmConnTest.Conn")
ConnObj.Connection = CN
response.Write (ConnObj.Connection.Connectionstring)
ConnObj.Open '此处错误
Set ConnObj = Nothing
[red]0x800A0BB9 "Arguments are of the wrong type, are out of acceptable range,or are in conflict with one
another."[/red]
我的分析:
ADO的Connection以及Recordset无法跨进程使用
本例中的Connection由ASP创建,位于一个叫做IIS Out-Of-Process Pooled Applications的COM+程序内(某个Dllhost.exe进程)
在COM环境下,我的组件是进程内dll,和该ASP - COM+程序位于同一个dllhost.exe内,所以正常
一旦部署入COM+成为一个独立的Application,组件位于另外一个独立的Dllhost.exe内
所以出错了
请问我的分析正确吗?
另外我现在的解决办法是写一个另外的ConnectionFactory组件,跟随我的组件部署于同一个Application内提供
connection,就运行正常了。
请问还有无更好的办法?
附上全部代码:
代码:
unit ZmConnImpl;
{$WARN SYMBOL_PLATFORM OFF}
interface
uses
ComObj, ActiveX, AspTlb, ZmConnTest_TLB, StdVcl,ADODB,ADODB_TLB
,Variants;
type
TConn = class(TASPMTSObject, IConn)
public
procedure Initialize; override;
destructor Destroy;override;
protected
function Get_Connection: Connection15; safecall;
procedure Set_Connection(const Value: Connection15); safecall;
function Get_test: WideString; safecall;
procedure Set_test(const Value: WideString); safecall;
procedure Open; safecall;
function Get_Recordset: Recordset15; safecall;
procedure Set_Recordset(const Value: Recordset15); safecall;
private
FIConn : Connection15;
FIRecordset : Recordset15;
FORecordset : OleVariant;
end;
implementation
uses ComServ;
procedure TConn.Initialize;
begin
inherited;
FIRecordset := coRecordset.Create;
end;
destructor TConn.Destroy;
begin
FIRecordset := nil;
FIConn := nil;
inherited Destroy;
end;
function TConn.Get_Connection: Connection15;
begin
Result := FIConn;
end;
procedure TConn.Set_Connection(const Value: Connection15);
begin
FIConn := Value;
end;
function TConn.Get_test: WideString;
begin
Result := FIRecordset.Fields.Item['us_name'].Value;
end;
procedure TConn.Set_test(const Value: WideString);
begin
end;
procedure TConn.Open;
var
vSource , vConn :OleVariant;
begin
vSource := 'SELECT * FROM t_users';
vConn := FIConn;
FIRecordset.Open(vSource ,vConn ,adOpenDynamic,adLockOptimistic,adCmdText);
end;
function TConn.Get_Recordset: Recordset15;
begin
Result := FIRecordset;
end;
procedure TConn.Set_Recordset(const Value: Recordset15);
begin
FIRecordset := Value;
end;
initialization
TAutoObjectFactory.Create(ComServer, TConn, Class_Conn,
ciMultiInstance, tmApartment);
end.