我试图将 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 缺少一些属性和功能?