gpt4 book ai didi

c++ - 将 ISO C++ 类公开给 VB6 应用程序

转载 作者:可可西里 更新时间:2023-11-01 16:35:15 24 4
gpt4 key购买 nike

我开发了一个 C++ 类来访问 USB 上的软件保护加密狗。 C++ 类是在 Linux 下用 g++ 开发的,但我可以在 Windows 下使用 MinGW 编译成功。我有一个使用 VB6 (Visual Basic 6) 构建的科学应用程序。

问题是如何将我的 C++ 类公开给 VB6 应用程序?有哪些可行的方法?我需要使用 COM 吗? (好吧,“无微软”解决方案更可取:)

非常感谢您的帮助!

更新 1. 阅读您的评论后,我意识到我需要为 C++ 类实现一个 COM 包装器。周围有什么好的和最近的例子吗?我可以使用 MinGW(并避免使用 MSVC)实现 COM 包装器吗?

更新 2. 最后,我决定悬赏这个问题。以下是我想更好地理解的事情:

1. 我意识到我需要为我的 C++ 类实现一个 COM 包装器。有人可以向我提供有关如何为这样的类(class)制作这个的工作示例吗:

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 包装器?

最佳答案

要从 Visual Basic 访问 COM C++ 类,您需要使用称为 IDL 的元语言指定其接口(interface)。它将用于生成将由 Visual Basic 读取的类型库和 C++ 中的类框架,以便像将调用委托(delegate)给 ValueMapper 对象一样实现。这是由名为 midl.exe 的工具完成的。它带有 Windows 平台 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 接口(interface)以及 DLL 注册代码。您可以在 Internet 上找到相关的代码片段,即在以下页面上:

http://www.dcl.hpi.uni-potsdam.de/LV/Components04/VL5/MSDN/DrGUI-on-COM.html http://www.codeproject.com/KB/COM/simplecomserver.aspx

我还组装了一个实现此接口(interface)的 VC++ 10 完整项目,如果您想看一下,请告诉我。

关于c++ - 将 ISO C++ 类公开给 VB6 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5581966/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com