怎么从dll文件获取失败IDL接口信息

把类封装成dll文件,最全面的把类封装成dll文件文章 - 电子工程世界网
把类封装成dll文件
在电子工程世界为您找到如下关于“把类封装成dll文件”的新闻
把类封装成dll文件资料下载
把类封装成dll文件,在网络通讯中调用把类封装成dll文件,在网络通讯中调用把类封装成dll文件,在网络通讯中调用把类封装成dll文件,在网络通讯中调用...
把类封装成dll文件相关帖子
°~90°或更大,散射剂的量较大。
?3.按发光二极管的结构分
??按发光二极管的结构分有全环氧包封、金属底座环氧封装、陶瓷底座环氧封装及玻璃封装等结构。
?4.按发光强度和工作电流分
??按发光强度和工作电流分有普通亮度的LED(发光强度&10mcd);超高亮度的LED(发光强度&100mcd);把发光强度在10~100mcd间的叫高亮度发光二极管。一般LED的工作电流在十几mA...
的解码功能调用了N多.h文件和.lib文件,而A程序是基于C#的,不能之间使用.h和.lib,必须都要封装成dll,可是我没弄清楚把.h和.lib封装成dll,故放弃了这种方法...
2、采用WM_COPYDATA在两个应用程序间传递数据。
此方法中发送调用了SendMessage函数,接收重载了WndProc。
但是在CE下C++中不支持SendMessage中的某个参数形式,而C#下又...
把类封装成dll文件视频
把类封装成dll文件创意
你可能感兴趣的标签
热门资源推荐如何在Delphi中调用VC6.0开发的COM
当前位置:
如何在Delphi中调用VC6.0开发的COM
如何在Delphi中调用VC6.0开发的COM
上次写了如何在VC6.0下对Delphi写的COM进行调用,原本想马上写如何在Delphi中调用VC6.0开发的COM时,由于在写事例程序中碰到了个很怪的问题,在我机子上用VC写的接口程序编译能通过。但是调用就会出现问题,(在VC下调用也是一样的出现)。但是用Delphi写的接口程序编译后,不管是在VC下还是在Delphi下调用都没有问题。后来我把VC开发的接口程序编译后,拷贝到其它机子上试,怪事,完全没有问题了。总结后才知道是我机子有点问题。我到现在还没有解决为什么在我的机子上不行,在其它机子上可以。(如果哪位朋友有什么见意,请和我联系,我想这个问题很有可能是因为注册的原因)不多说了。还是说正事吧!
在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";
uuid(78313A6E-FBA7-11D5-C4EA60F),
helpstring("ITestCom Interface"),
pointer_default(unique)
interface ITestCom : IDispatch
[id(1), helpstring("method ShowMsg")] HRESULT ShowMsg();
uuid(78313A62-FBA7-11D5-C4EA60F),
version(1.0),
helpstring("MaAtl 1.0 Type Library")
library MAATLLib
importlib("stdole32.tlb");
importlib("stdole2.tlb");
uuid(78313A6F-FBA7-11D5-C4EA60F),
helpstring("TestCom Class")
coclass TestCom
[default] interface ITestC
Delphi手工转换的Pascal文件:
unit MaAtlDll_TLB;
// *******************************************************//
// TypeLibrary Major and minor versions
MaAtlMajorVersion = 1;
MaAtlMinorVersion = 0;
LIBID_MaAtl: TGUID = ''''{78313A62-FBA7-11D5-C4EA60F}'''';
IID_ITestCom: TGUID = ''''{78313A6E-FBA7-11D5-C4EA60F}'''';
CLASS_TestCom: TGUID = ''''{78313A6F-FBA7-11D5-C4EA60F}'''';
// *******************************************************//
// Forward declaration of types defined in TypeLibrary
// *******************************************************//
ITestCom =
// *******************************************************//
// Declaration of CoClasses defined in Type Library
// (NOTE: Here we map each CoClass to its Default Interface)
// *******************************************************//
TestCom= ITestC
// *******************************************************//
// Interface: IMaAtlCom
// Flags: (256) OleAutomation
// *******************************************************//
ITestCom = interface(IDispatch)
[''''{78313A6E-FBA7-11D5-C4EA60F}'''']
function ShowMsg(): HR
// *******************************************************//
CoTestCom = class
class function Create: ITestC
class function CreateRemote(const MachineName: string): ITestC
implementation
class function CoTestCom.Create: ITestC
Result := CreateComObject(CLASS_TestCom) as ITestC
class function CoTestCom.CreateRemote(const MachineName: string): ITestC
Result := CreateRemoteComObject(MachineName, CLASS_TestCom) as ITestC
看它们转换是不是很简单呀!
3、生成一个Delphi工程,在引用中引用刚才手工写的描述文件MaAtlDll_TLB文件。这样引用单元中就可以定义接口如入:
pS : ITestC
这样就可以创建接口:
pS := CreateComObject(CLASS_TestCom) as ITestC//如果在编译中提示没定义 //CreateComObject()这是因为你在引用中没引用ComObj单元。
调用方面ShowMsg();
别忘了退出时把接释放呀!
对工程进行编译,还不能运行。因为你还没有注册我们的接口maAtl.dll。用regsrv32进行注册后就可以运行了。
谢谢能抽空看,如果有什么问题可写信给我。没有VC的朋友,不能编译MaAtl时,在DyVCcom下有编译好的MaAtl.dll,只要注册它后就可以运行了。
最热点击文章
最新代码下载
最新杂志下载I have a .dll that contains some directshow filters (COM) with specific/custom interfaces to query.
Most 3rd party directshow components contain embedded .tlb files that can be used for cross-enviroment communication (C# typelib import).
I would hate to have to attempt to manually create the interfaces needed for c# because no idl/tlb files were provided.
Is it possible to generate a tlb (or at least, an idl, which I can MIDL compile) from a COM .dll?
解决方案 Yes, it is possible to reverse engineer/disassemble IDL (or something very close to it).
What you need to do is give yourself a new C++ Console Project which gives the default code of
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
and then you insert an #import statement underneath the #include statement.
So I have been playing with C# assembly marked up to function as a COM Interop DLL and I have called it ComExample2 and it lives in the same solution as the C++ console project that I added which means I can use a nice relative pathname.
So my #import statement looks like
#import "..\ComExample2\bin\Debug\ComExample2.tlb" no_namespace named_guids
Then you build your console application.
If you delve into the files generated during the build you will find a file that ends with .TLH which stands for type library header.
So my path is
..\ComExample2\ConsoleApplication1\Debug\comexample2.tlh
Inside my file is something which looks very much like idl.
Here is an edited snippet to give you a flavour....
struct __declspec(uuid("515b1b18--b743-f1b3c458a0d0"))
/* LIBID */ __ComExample2;
struct /* coclass */ ComExampleClass2;
// Type library items
struct __declspec(uuid("713007fe-e74c-4fec-b91a-5ef8df279929"))
IFoo : IDispatch
// Wrapper methods for error-handling
_bstr_t Greeting ( );
long Sim (
// Raw methods provided by interface
virtual HRESULT __stdcall raw_Greeting (
/*[out,retval]*/ BSTR * pRetVal ) = 0;
virtual HRESULT __stdcall raw_Sim (
/*[in]*/ long a,
/*[in]*/ long b,
/*[out,retval]*/ long * pRetVal ) = 0;
struct __declspec(uuid("efe233b5-8ab3-f027e0a72d5"))
ComExampleClass2;
// interface _Object
// [ default ] interface IFoo
All of this is generated code so that you can script C++ code against a COM library easily.
You'll have to pick through what you need but hopefully that should be enough.
Kind regards,
Lord BattenBerg
本文地址: &
我有一个.dll包含一些directshow过滤器(COM)与特定/自定义接口来查询。
大多数第三方directshow组件包含嵌入的.tlb文件可以用于跨环通信(C#typelib import)。
我不愿意尝试手动创建c#所需的接口,因为没有提供idl / tlb文件。
是否可以从COM .dll生成tlb(或至少是一个idl,我可以MIDL编译)?
解决方案 是的,可以反向工程/反汇编IDL(或其他非常接近它)。你需要做的是给自己一个新的C ++控制台项目,它提供默认代码
#include“stdafx.h”
int _tmain(int argc,_TCHAR * argv []) { return 0; }
,然后在#include语句下插入#import语句。所以我一直在玩C#汇编标记为COM Interop DLL,我称之为ComExample2,它住在与我添加的C ++控制台项目相同的解决方案,这意味着我可以使用一个很好的相对路径名。所以我的#import语句看起来像
#import“.. \ComExample2\bin\Debug\ComExample2.tlb “no_namespace named_guids
然后构建控制台应用程序。如果你深入研究在生成期间生成的文件,你会发现一个以.TLH结尾的文件,它代表类型库头。所以我的路径是
.. \ComExample2\ConsoleApplication1\Debug\comexample2.tlh
在我的文件里面看起来很像idl。这是一个编辑片段,给你一个风味....
struct __declspec(uuid(“515b1b18-- b743-f1b3c458a0d0“)) / * LIBID * / __ComExample2;
struct / * coclass * / ComExampleClass2;
//类库库项目 //
struct __declspec(uuid(“713007fe-e74c-4fec-b91a-5ef8df279929”) ) IFoo:IDispatch
//错误处理的封装方法 //
_bstr_t Greeting();
long Sim( long a, long b);
//接口提供的原始方法 //
virtual HRESULT __stdcall raw_Greeting( / * [out,retval ] * / BSTR * pRetVal)= 0;
virtual HRESULT __stdcall raw_Sim( / * [in] * / long a, / * [in] * / long b, / * [out,retval] long * pRetVal)= 0; };
struct __declspec(uuid(“efe233b5-8ab3-f027e0a72d5”)) ComExampleClass2;
// interface _Object
// [default] interface IFoo
这是生成代码,以便您可以轻松地将C ++代码对照COM库。
Lord BattenBerg
本文地址: &
扫一扫关注官方微信}

我要回帖

更多关于 dll文件接口 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信