【问题标题】:How to cast Variant to TADOConnection.ConnectionObject?如何将 Variant 转换为 TADOConnection.ConnectionObject?
【发布时间】:2010-12-30 12:12:48
【问题描述】:

我收到了存储在 Variant 中的本机 COM ADOConnection。我想将此连接的接口传递给 VCL 包装器 TADOConnection。问题是我收到无效的类型转换编译器消息或访问冲突。

例如:

procedure AssignNativeConnection(VCLConnection: TADOConnection; var NativeConnection: Variant);
var
  VariantManager: TVariantManager;
  AInterface: IInterface;
begin
  AInterface := VCLConnection.ConnectionObject;
  VariantManager.VarToIntf(AInterface, NativeConnection);  //oops AV here!
end;

任何想法如何解决这个问题?我正在使用 Delphi 2007。

提前致谢。

【问题讨论】:

    标签: delphi com interface ado


    【解决方案1】:

    我已经多次使用来自变体的普通 IUnknown 强制转换,然后使用 as 运算符,就像这样:

    VCLConnection.ConnectionObject:=(IUnknown(NativeConnection) as _Connection);
    

    (我注意到 ConnectionObject 属性的类型是 _Connection 并且它是在 ADIOnt 单元中定义的。) 当然,您仍然会在无效指针或零指针或任何对基本接口调用(QueryInterface 等)没有正确响应的情况下获得 AV

    【讨论】:

    • 非常感谢 Stijn!它完美地工作。你也可以像这样在没有 as 的情况下投射它:_Connection((IUnknown(NativeConnection))。对我来说神秘的是为什么 VarToIntf() 给我一个 AV...
    猜你喜欢
    • 2010-10-11
    • 2017-01-26
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多