我开发了一个C ++类来访问USB上的软件保护加密狗。 C ++类是用Linux下的g ++开发的,但我可以在Windows下使用MinGW成功编译它。我有一个用VB6(Visual Basic 6)构建的科学应用程序。
问题是如何将我的C ++类暴露给VB6应用程序?有什么可能的方法呢?我需要使用COM吗? (好吧,“微软少”的解决方案更可取:)
非常感谢您的帮助!
更新1。阅读您的评论我意识到我需要为C ++类实现一个COM包装器。周围有什么好的和最近的例子吗?我可以使用MinGW实现COM包装器(并避免使用MSVC)吗?
更新2。最后,我决定为这个问题提供赏金。以下是我想要更好理解的内容:
1。我意识到我需要为我的C ++类实现一个COM包装器。有人可以提供一些工作示例,说明如何为这样的课程制作这个:
class ValueMapper
{
public:
ValueMapper( ) { }
ValueMapper( double fmin, double fmax, int ilength ) {
SetMapping( fmin, fmax, ilength );
}
inline double GetMin() { return min; }
inline double GetMax() { return max; }
inline int GetLength() { return length; }
virtual inline void SetMapping( double fmin, double fmax, int ilength )
{
min = fmin;
max = fmax;
length = ilength;
}
virtual inline int MapValue( double value ) {
double factor = length / (max - min);
return (int)RoundTo( (value-min) * factor );
}
static double RoundTo( double value, double eps = 1 ) {
return floor(value/eps + 0.5) * eps;
}
protected:
double min;
double max;
int length;
};
2. 如何使用VB6生成的COM包装器?我是否需要注册COM服务器?我可以在没有注册的情况下使用吗?
3。可选。是否可以使用MinGW实现COM包装?
答案 0 :(得分:8)
要从Visual Basic访问COM C ++类,您需要使用称为IDL的元语言指定其接口。它将用于生成将由Visual Basic读取的类型库和C ++中的类骨架,以实现,例如将调用委托给ValueMapper对象。它由名为midl.exe的工具完成。它随Windows Platform SDK或任何VC ++环境一起提供。如果您没有自己的,可以免费下载VC ++ 10 Express Edition。
您对象的IDL文件可能如下所示:
import "oaidl.idl";
[
uuid(C6907FD4-9F56-499A-A784-6168AB3352D6),
version(1.0),
local,
oleautomation
]
interface IValueMapper : IDispatch
{
[id(1), propget] double Min();
[id(2),propget] double Max();
[id(3),propget] int Length();
[id(4)] void SetMapping( [in] double fmin, [in] double fmax, [in] int ilength );
[id(5)] int MapValue([in] double value);
[id(6)] double RoundTo( [in] double value,[in,defaultvalue(1)] double eps );
};
[
uuid(1C110E43-A56F-41A2-8052-EF85FF96082F),
version(1.0),
helpstring("Value Mapper Library"),
] library ValueMapperLib
{
importlib("stdole32.tlb");
interface IValueMapper;
[
uuid(D1A2F830-994E-4495-A9C3-1440155578A9),
helpstring("Value Mapper Component Class")
]
coclass ValueMapperClassObject
{
[default] interface IValueMapper;
}; //end coclass def
};
现在,您可以通过从IValueMapper派生类并使用ValueMapper成员实现其功能来提供所需的功能。不幸的是,您还需要提供一些样板代码来实现类对象,IUnknown和IDispatch接口以及DLL注册代码。您可以在互联网上找到相关的代码片段,例如:
http://www.dcl.hpi.uni-potsdam.de/LV/Components04/VL5/MSDN/DrGUI-on-COM.html http://www.codeproject.com/KB/COM/simplecomserver.aspx
此外,我已经组装了一个实现此接口的VC ++ 10完整项目,请告诉我您是否想要查看它。
答案 1 :(得分:5)
我知道有两种可能的方式:
1)在你的类周围编写一个COM包装器,直接从VB6访问它。
2)创建一个类的C接口(通过“展平它”)并在一个普通的DLL中公开它。
前一种方法比较常见,但听起来你可能更喜欢后者。