如何在Delphi中调用VC6.0开发的COM
1个回答
推荐于2016-12-03 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
向TA提问 私信TA
知道合伙人数码行家
采纳数:117538
获赞数:517191
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。
向TA提问 私信TA
关注
展开全部
在VC6.0下开发接口时,会生成一个对应文件名.idl(Interface Definition)接口描述文件。(IDL其语法也很简单,但它在接口的开发中是很重要的。我看过本书,一个对COM很熟的牛XX老外就说,开发COM一切从IDL开始。当然了我们可不是这样的。因为我们不牛XX。所以办不到。还是交给软件写吧!)得到这个IDL文件后,可用IDLtoPas.exe工具(NND,我找这个工具找了半年都有没找到,现在也没有,听说在Delphi6.0中有。所以只有手工把IDL文件用Pascal来描述,也不难,都有是符号的转换工作),把IDL文件转成用Pascal描述的文件。这样我们就可以对其接口进行调用了。当然调用接口时,少不了要接口的.DLL文件和.IDL文件,IDL文件用来生成对应的Pascal文件,生成好后,IDL就可以不要了。而.Dll文件是接口编译后的动态库。这个大家都有知道。好就讲这么多。还是给个小例了吧!
1、用VC6.0生成一个接口程序,在这里我就不多说,我生成的这个程序只有一个接口叫ITestCom其中有一个方法为:ShowMsg(),显示一个消息对话框。
2、对其上面生成的程序进行编译,把生成的IDL文件用在Delphi下用Pascal描述:
VC生成的IDL文件:
// MaAtl.idl : IDL source for MaAtl.dll
//
// This file will be
processed by the MIDL tool to
// produce the type library (MaAtl.tlb) and
marshalling code.
import "oaidl.idl";
import
"ocidl.idl";
[
object,
uuid(78313A6E-FBA7-11D5-8094-00E04C4EA60F),
dual,
helpstring("ITestCom
Interface"),
pointer_default(unique)
]
interface ITestCom :
IDispatch
{
[id(1), helpstring("method ShowMsg")] HRESULT
ShowMsg();
};
[
uuid(78313A62-FBA7-11D5-8094-00E04C4EA60F),
version(1.0),
helpstring("MaAtl
1.0 Type Library")
]
library
MAATLLib
{
importlib("stdole32.tlb");
importlib("stdole2.tlb");
[
uuid(78313A6F-FBA7-11D5-8094-00E04C4EA60F),
helpstring("TestCom
Class")
]
coclass TestCom
{
[default] interface
ITestCom;
};
};
Delphi手工转换的Pascal文件:
unit MaAtlDll_TLB;
//
*********************************************************************//
const
//
TypeLibrary Major and minor versions
MaAtlMajorVersion =
1;
MaAtlMinorVersion = 0;
LIBID_MaAtl: TGUID =
''''{78313A62-FBA7-11D5-8094-00E04C4EA60F}'''';
IID_ITestCom: TGUID =
''''{78313A6E-FBA7-11D5-8094-00E04C4EA60F}'''';
CLASS_TestCom: TGUID =
''''{78313A6F-FBA7-11D5-8094-00E04C4EA60F}'''';
type
//
*********************************************************************//
//
Forward declaration of types defined in TypeLibrary
//
*********************************************************************//
ITestCom
= interface;
//
*********************************************************************//
//
Declaration of CoClasses defined in Type Library
// (NOTE: Here we map each
CoClass to its Default Interface)
//
*********************************************************************//
TestCom=
ITestCom;
//
*********************************************************************//
//
Interface: IMaAtlCom
// Flags: (256) OleAutomation
//
*********************************************************************//
ITestCom
=
interface(IDispatch)
[''''{78313A6E-FBA7-11D5-8094-00E04C4EA60F}'''']
function
ShowMsg(): HResult; stdcall;
end;
//
*********************************************************************//
CoTestCom
= class
class function Create: ITestCom;
class function CreateRemote(const
MachineName: string): ITestCom;
end;
implementation
uses
ComObj;
class function CoTestCom.Create: ITestCom;
begin
Result :=
CreateComObject(CLASS_TestCom) as ITestCom;
end;
class function
CoTestCom.CreateRemote(const MachineName: string): ITestCom;
begin
Result
:= CreateRemoteComObject(MachineName, CLASS_TestCom) as
ITestCom;
end;
end.
看它们转换是不是很简单呀!
3、生成一个Delphi工程,在引用中引用刚才手工写的描述文件MaAtlDll_TLB文件。这样引用单元中就可以定义接口如入:
var
pS : ITestCom;
这样就可以创建接口:
pS := CreateComObject(CLASS_TestCom) as ITestCom;//如果在编译中提示没定义
//CreateComObject()这是因为你在引用中没引用ComObj单元。
调用方面ShowMsg();
别忘了退出时把接释放呀!
pS := nil;
对工程进行编译,还不能运行。因为你还没有注册我们的接口maAtl.dll。用regsrv32进行注册后就可以运行了。
1、用VC6.0生成一个接口程序,在这里我就不多说,我生成的这个程序只有一个接口叫ITestCom其中有一个方法为:ShowMsg(),显示一个消息对话框。
2、对其上面生成的程序进行编译,把生成的IDL文件用在Delphi下用Pascal描述:
VC生成的IDL文件:
// MaAtl.idl : IDL source for MaAtl.dll
//
// This file will be
processed by the MIDL tool to
// produce the type library (MaAtl.tlb) and
marshalling code.
import "oaidl.idl";
import
"ocidl.idl";
[
object,
uuid(78313A6E-FBA7-11D5-8094-00E04C4EA60F),
dual,
helpstring("ITestCom
Interface"),
pointer_default(unique)
]
interface ITestCom :
IDispatch
{
[id(1), helpstring("method ShowMsg")] HRESULT
ShowMsg();
};
[
uuid(78313A62-FBA7-11D5-8094-00E04C4EA60F),
version(1.0),
helpstring("MaAtl
1.0 Type Library")
]
library
MAATLLib
{
importlib("stdole32.tlb");
importlib("stdole2.tlb");
[
uuid(78313A6F-FBA7-11D5-8094-00E04C4EA60F),
helpstring("TestCom
Class")
]
coclass TestCom
{
[default] interface
ITestCom;
};
};
Delphi手工转换的Pascal文件:
unit MaAtlDll_TLB;
//
*********************************************************************//
const
//
TypeLibrary Major and minor versions
MaAtlMajorVersion =
1;
MaAtlMinorVersion = 0;
LIBID_MaAtl: TGUID =
''''{78313A62-FBA7-11D5-8094-00E04C4EA60F}'''';
IID_ITestCom: TGUID =
''''{78313A6E-FBA7-11D5-8094-00E04C4EA60F}'''';
CLASS_TestCom: TGUID =
''''{78313A6F-FBA7-11D5-8094-00E04C4EA60F}'''';
type
//
*********************************************************************//
//
Forward declaration of types defined in TypeLibrary
//
*********************************************************************//
ITestCom
= interface;
//
*********************************************************************//
//
Declaration of CoClasses defined in Type Library
// (NOTE: Here we map each
CoClass to its Default Interface)
//
*********************************************************************//
TestCom=
ITestCom;
//
*********************************************************************//
//
Interface: IMaAtlCom
// Flags: (256) OleAutomation
//
*********************************************************************//
ITestCom
=
interface(IDispatch)
[''''{78313A6E-FBA7-11D5-8094-00E04C4EA60F}'''']
function
ShowMsg(): HResult; stdcall;
end;
//
*********************************************************************//
CoTestCom
= class
class function Create: ITestCom;
class function CreateRemote(const
MachineName: string): ITestCom;
end;
implementation
uses
ComObj;
class function CoTestCom.Create: ITestCom;
begin
Result :=
CreateComObject(CLASS_TestCom) as ITestCom;
end;
class function
CoTestCom.CreateRemote(const MachineName: string): ITestCom;
begin
Result
:= CreateRemoteComObject(MachineName, CLASS_TestCom) as
ITestCom;
end;
end.
看它们转换是不是很简单呀!
3、生成一个Delphi工程,在引用中引用刚才手工写的描述文件MaAtlDll_TLB文件。这样引用单元中就可以定义接口如入:
var
pS : ITestCom;
这样就可以创建接口:
pS := CreateComObject(CLASS_TestCom) as ITestCom;//如果在编译中提示没定义
//CreateComObject()这是因为你在引用中没引用ComObj单元。
调用方面ShowMsg();
别忘了退出时把接释放呀!
pS := nil;
对工程进行编译,还不能运行。因为你还没有注册我们的接口maAtl.dll。用regsrv32进行注册后就可以运行了。
网易云信
2023-12-06 广告
2023-12-06 广告
UIkit是一套轻量级、模块化且易于使用的开源UI组件库,由YOOtheme团队开发。它提供了丰富的界面元素,包括按钮、表单、表格、对话框、滑块、下拉菜单、选项卡等等,适用于各种类型的网站和应用程序。UIkit还支持响应式设计,可以根据不同...
点击进入详情页
本回答由网易云信提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询