我很新的DLL对象,我到处搜索,找不到正确的答案。 我正在做一个微软RMS的小插件,它会自动调用我的dll中的函数Process,IDispach参数传递当前会话的详细信息。COM对象和不同版本的DLL
我使用的接口从QSRules.dll(组件>导入>组件>输入库...添加到项目)。 它创建TLB与所有的引用等
与软件2.01版完美的作品,但试图利用对2.02版相同的功能,当它与“接口不支持”崩溃文件。 QSRules.dll有更新的版本和所有类的GUID是不同的。
我试图与休耕代码:
procedure TRefreshScreenRefreshScreen.Process(const Session: IDispatch);
begin
if Supports(Session, QSRules_TLB_2_0_0_151.SessionClass) then
Begin
CodeSite.Send(csmLevel1, '(Session as SessionClass).Cashier.Name', (Session as QSRules_TLB_2_0_0_151.SessionClass).Cashier.Name);
CodeSite.Send(csmLevel1, '(Session as SessionClass).Cashier.Number', (Session as QSRules_TLB_2_0_0_151.SessionClass).Cashier.Number);
end else
if Supports(Session, QSRules_TLB_2_0_0_105.SessionClass) then
Begin
CodeSite.Send(csmLevel1, '(Session as SessionClass).Cashier.Name', (Session as QSRules_TLB_2_0_0_105.SessionClass).Cashier.Name);
CodeSite.Send(csmLevel1, '(Session as SessionClass).Cashier.Number', (Session as QSRules_TLB_2_0_0_151.SessionClass).Cashier.Number);
end
end;
是有4个或5个不同版本的DLL都具有不同的GUID的BU 98的代码%的所有的人之间的相同。 这样做是不合理的乘法代码。
有什么办法可以缩短它吗?
我也试过
procedure TRefreshScreenRefreshScreen.Process(const Session: IDispatch);
var
_Session: SessionClass;
begin
if Supports(Session, QSRules_TLB_2_0_0_151.SessionClass) then
_Session = (Session as QSRules_TLB_2_0_0_151.SessionClass)
else if Supports(Session, QSRules_TLB_2_0_0_105.SessionClass) then
_Session = (Session as QSRules_TLB_2_0_0_105.SessionClass);
with _Session do
Begin
CodeSite.Send(csmLevel1, '_Session.Cashier.Name', Cashier.Name);
CodeSite.Send(csmLevel1, '_Session..Cashier.Number', Cashier.Number);
End;
end;
但这不起作用,因为变量的类型只能从唯一的单位进行分配。
任何帮助表示赞赏!
听起来像一个非常可怕的COM接口!你不能使用单一版本的DLL来分发你的应用程序,并且使用并行COM来确保你得到你想要的版本。支持多个版本将是可怕的。你会如何测试? –