尝试导入 .NET 程序集 dll COM 时缺少某些属性和函数

问题描述 投票:0回答:0

我试图将 COM 程序集 dll 文件导入我在 Delphi 10.2 Tokyo 中的 Delphi 项目。 首先,我为此使用 Cross Talk 框架。导入没问题,我成功地使用了 dll 属性和功能。

然后我尝试使用delphi自己的dll导入器(组件->安装组件->导入.NET程序集),但是在创建TLB.pas文件后我发现导入后缺少一些属性。而这个缺失让我的 delphi 项目失败了。 以下是遗漏的部分:

来自 Cross Talk 框架的 TLB 文件:

        clsMessage = class(TCTBaseObject)
  private
    function CancelTimeoutRead: Int32;
    procedure CancelTimeoutWrite(
      const aValue: Int32);
    function crequestRead: clsrequests;
    procedure crequestWrite(
      const aValue: clsrequests);
    function cresponseRead: clsresponses;
    function getThreadRead: CallBackThread;
    procedure getThreadWrite(
      const aValue: CallBackThread);
    function IsRecievingDataRead: Int32;
    procedure IsRecievingDataWrite(
      const aValue: Int32);
    function MACActiveRead: Boolean;
    procedure MACActiveWrite(
      const aValue: Boolean);
    function MultiAccDataRead: ByteArray;
    function requestRead: clsMessage_request_s;
    procedure requestWrite(
      const aValue: clsMessage_request_s);
    function responseRead: clsMessage_response_s;
    function RetResponseRead: Int32;
    procedure RetResponseWrite(
      const aValue: Int32);
  protected
    class function CTFullTypeName: string; override;
  public
    const ClassId: string = '3dd0c242-2a69-43f3-97db-b0a5610a05f3';
    const InterfaceId: string = '882d860d-365b-4949-98d5-22eb325199ff';
    const EventsId: string = '30ad70d6-a661-4339-a5f7-5d578708a0c1';
    constructor Create; overload; override;
    function bcd2str(
      const aBuf: ByteArray): string; overload;
    function CreateMessageBuf(
      const aWithClass: Int32): ByteArray; overload;
    procedure memcpy(
      const aDesArray: ByteArray; 
      const aSrcArray: ByteArray; 
      const aSrcArrayPos: Int32; 
      const aLength: Int32); overload;
    function ParseMessage(
      const aBuffer: ByteArray; 
      const aWithClass: Int32): Int32; overload;
    function AsciiEncode(
      const aStart: Int32; 
      const aTo: Int32; 
      const aBuffer: ByteArray): string; overload;
    function ethernetSendMessage(
      const aMsg: ByteArray): Int32; overload;
    function SendMessage(
      const aWithClass: Int32): Int32; overload;
    function CancelMessage(
      const aWithClass: Int32): Int32; overload;
    function ReceiveMessage(
      const aWithClass: Int32): Int32; overload;
    function Equals(
      const aObj: TCTObject): Boolean; reintroduce; overload;
    function GetHashCode: Int32; reintroduce; overload;
    function GetType: TypeNET; overload;
    function ToString: string; reintroduce; overload;

    property CancelTimeout: Int32 read CancelTimeoutRead write CancelTimeoutWrite;
    property crequest: clsrequests read crequestRead write crequestWrite;
    property cresponse: clsresponses read cresponseRead;
    property getThread: CallBackThread read getThreadRead write getThreadWrite;
    property IsRecievingData: Int32 read IsRecievingDataRead write IsRecievingDataWrite;
    property MACActive: Boolean read MACActiveRead write MACActiveWrite;
    property MultiAccData: ByteArray read MultiAccDataRead;
    property request: clsMessage_request_s read requestRead write requestWrite;
    property response: clsMessage_response_s read responseRead;
    property RetResponse: Int32 read RetResponseRead write RetResponseWrite;
  end;

来自 delphi 组件导入器的 TLB 文件:

  IClsMessage = interface(IDispatch)
    ['{882D860D-365B-4949-98D5-22EB325199FF}']
    function Get_MultiAccData: PSafeArray; safecall;
    procedure Set_IsRecievingData(pRetVal: Integer); safecall;
    function Get_IsRecievingData: Integer; safecall;
    function Get_MACActive: WordBool; safecall;
    procedure Set_MACActive(pRetVal: WordBool); safecall;
    function Get_request: request_s; safecall;
    procedure Set_request(pRetVal: request_s); safecall;
    function Get_response: response_s; safecall;
    function Get_crequest: _clsrequests; safecall;
    procedure _Set_crequest(const pRetVal: _clsrequests); safecall;
    function Get_cresponse: _clsresponses; safecall;
    procedure Set_RetResponse(pRetVal: Integer); safecall;
    function Get_RetResponse: Integer; safecall;
    procedure _Set_getThread(const pRetVal: _CallBackThread); safecall;
    function Get_getThread: _CallBackThread; safecall;
    function bcd2str(buf: PSafeArray): WideString; safecall;
    function CreateMessageBuf(withClass: Integer): PSafeArray; safecall;
    procedure memcpy(desArray: PSafeArray; srcArray: PSafeArray; srcArrayPos: Integer; 
                     length: Integer); safecall;
    function ParseMessage(buffer: PSafeArray; withClass: Integer): Integer; safecall;
    function SendMessage(withClass: Integer): Integer; safecall;
    function CancelMessage(withClass: Integer): Integer; safecall;
    function ReceiveMessage(withClass: Integer): Integer; safecall;
    property MultiAccData: PSafeArray read Get_MultiAccData;
    property IsRecievingData: Integer read Get_IsRecievingData write Set_IsRecievingData;
    property MACActive: WordBool read Get_MACActive write Set_MACActive;
    property request: request_s read Get_request write Set_request;
    property response: response_s read Get_response;
    property crequest: _clsrequests read Get_crequest write _Set_crequest;
    property cresponse: _clsresponses read Get_cresponse;
    property RetResponse: Integer read Get_RetResponse write Set_RetResponse;
    property getThread: _CallBackThread read Get_getThread write _Set_getThread;
  end;

如果你检查两个生成的代码,你会发现delphi自己的导入器生成的TLB中缺少属性

CancelTimeOut
。为什么 delphi 缺少一些属性和功能?

c# .net delphi com dllimport
© www.soinside.com 2019 - 2024. All rights reserved.