Delphi如何为新的ITextRange2类型接口导入类型库?

时间:2013-07-30 02:10:11

标签: delphi delphi-2007 richedit typelib

我在Delphi中使用Microsoft Text Object Model类型库来使用Microsoft RichEdit控件的某些功能。该类型库包含在免费软件组件中,并且多年来一直运行良好。例如,这是一个显示的ITextDocument接口:

  ITextDocument = interface(IDispatch)
    ['{8CC497C0-A1DF-11CE-8098-00AA0047BE5D}']
    function Get_Name: WideString; safecall;
    function Get_Selection: ITextSelection; safecall;
    function Get_StoryCount: Integer; safecall;
  ...

我不知道是怎么创造的。现在我想更新它,以便在Windows 8(MSFTEDIT.DLL)中为RichEdit发布新接口。例如,根据MSDN,ITextDocument2中有一个Range2方法和一个新的ITextRange2接口。有什么方法可以使用Delphi的导入类型库功能来组成新接口的定义吗?

更新:我想出了如何生成该单元。在Delphi中,单击Import Component,然后从注册的服务中选择“tom”。这创建了一个完全相同的单位。现在的问题是,为了从Windows 8获得新的“tom”界面,如果我需要在其上安装Delphi,那就太多了。必须有一个更简单的方法。不知何故,我必须在Win 8上生成TLIB,然后在Windows 7上的Delphi中导入它。任何人都知道如何在Windows 8上为msftedit.dll或tom接口生成TLIB?

另一个发现:如果我通过打开tlib打开Delphi中的msftedit.dll,它会显示所有接口。还有一个导出按钮,但单击时不起作用。什么都没发生。我在帮助文件和网络上搜索了Type Lib Explorer帮助,但没有找到导致按钮不起作用的原因。

3 个答案:

答案 0 :(得分:2)

您可以使用命令行实用程序tlibimp在Windows 8上导入类型库。您可以在Delphi安装的tlibimp.exe目录中找到bin。由于您要避免在Windows 8计算机上安装Delphi,请将tlibimp.exe传输到Windows 8计算机。然后运行此命令:

tlibimp -P msftedit.dll

这将生成您需要的Pascal类型库导入文件。

答案 1 :(得分:0)

我在Windows 7 x86和Delphi 7中遇到了与SAPI相同的问题.32位架构的SAPI api是sapi.dll。 tlibimp.exe在路径上找不到此DLL:

D:\Temp\Merda>tlibimp -P  sapi.dll
Embarcadero TLIBIMP Version 12.16580
Copyright(c) 1995-2010 Embarcadero Technologies, Inc.

Opening  sapi.dll
Error loading type library sapi.dl

我发现它使用的是Microsoft OLE / COM对象查看器。像魅力一样:

D:\Temp>tlibimp -P c:\Windows\System32\Speech\Common\sapi.dll
Embarcadero TLIBIMP Version 12.16580
Copyright(c) 1995-2010 Embarcadero Technologies, Inc.

Opening  c:\Windows\System32\Speech\Common\sapi.dll
Type library loaded ....
Created  D:\Temp\SpeechLib_TLB.dcr
Created  D:\Temp\SpeechLib_TLB.pas

答案 2 :(得分:0)

如果您创建了.net 4.N“ .dll”的“ .tlb”,则tlibimp.exe仅适用于使用“ .dll”的.net 3.5。然后,tlibimp.exe在以下命令中可以正常工作。

@inject Microsoft.Extensions.Options.IOptions<Configuration> cfg

@code {
    private ViewModel _m;

    protected override void OnInitialized()
    {
        base.OnInitialized();
        _m = new ViewModel(cfg.Value);
    }

    protected async Task DoSearchAsync()
    {
        await _m.PerformSearchAsync();
    }
}

这样,您不会收到消息“错误加载类型库”。