我使用Delphi中的Microsoft文本对象模型类型库来使用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;
...
我不知道这是怎么产生的。现在我想为在Windows8中为RichEdit发布的新接口(MSFTEDIT.DLL)更新它。例如,ITextDocument2中有一个Range2方法,根据MSDN有一个新的ITextRange2接口。有没有什么方法可以使用Delphi的导入类型库功能来组成新接口的定义?
更新:我想好了如何生成该单元。在Delphi中,点击Import Component,然后从注册的服务中选择"tom"。这就创建了一个完全类似的单元。现在的问题是,为了从Windows8中获得新的"tom"界面,如果要求我在上面安装Delphi,那就太多了。必须有一个更简单的方法。不知怎么的,我必须在Win8上生成一个TLIB,然后在Windows7上导入我的Delphi。有人知道如何在Windows 8上为msftedit.dll或tom接口生成TLIB吗?
另一个发现:如果我在Delphi中以tlib打开msftedit.dll,它会显示所有接口。还有一个导出按钮,但单击后不起作用。什么也没发生。我在帮助文件和网络上搜索了Type Lib Explorer的帮助,但没有找到任何关于导出按钮不起作用的原因。
您可以使用命令行实用程序tlibimp
在Windows 8上导入类型库。您可以在Delphi安装的bin
目录中找到tlibimp.exe
。由于您希望避免在Windows 8机器上安装Delphi,请将tlibimp.exe
转移到Windows 8机器。然后运行以下命令:
tlibimp -P msftedit.dll
这将生成您需要的Pascal类型库导入文件。
我在Windows 7 x86和Delphi 7中使用SAPI时遇到了同样的问题。32位体系结构中的SAPI api是SAPI.dll。tlibimp.exe在路径上找不到此dll:
D:TempMerda>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:WindowsSystem32SpeechCommonsapi.dll
Embarcadero TLIBIMP Version 12.16580
Copyright(c) 1995-2010 Embarcadero Technologies, Inc.
Opening c:WindowsSystem32SpeechCommonsapi.dll
Type library loaded ....
Created D:TempSpeechLib_TLB.dcr
Created D:TempSpeechLib_TLB.pas
运行tlibimp.exe只能使用".dll"与.net 3.5配合使用…如果您创建了.net 4.N".dll"的".tlb",则tlibimpexe将可以使用以下命令正常工作。
"C:windowsMicrosoft.NETFramework...RegAsm.exe" My.Com.dll /tlb
"C:Program Files (x86)Borland...Bintlibimp.exe" My.Com.tlb
这样就不会得到消息"加载类型库时出错"。