我的老板希望我用 C++ (MSVC++2010) 编写一个 DLL,它可以执行卷影复制,他可以从 VB6(或稍后使用其他语言)调用它,并且可以在它执行时返回状态更新还没有完成。他称之为“事件”。
我有一种感觉,我终于需要学习COM了(我宁愿不...)...还有,我想到了一个回调函数,但是将函数指针从VB6移交给C++肯定是不可能的?
谁能概述一下我必须学习的内容以及如何实现,无论是否使用 COM?
编辑: 要回答一个问题,工作流程应该是:
VB6 应用程序确定要备份的文件
我得到了一个路径并制作了一个包含该路径的临时卷影拷贝并返回一个挂载点(或类似的)
- 在这一步中,我定期告诉 VB6 应用我有多远
VB6 应用程序备份卷影拷贝,然后删除卷影拷贝。
最佳答案
您可以使用 AddressOf
将指向“显示进度”功能的指针从 VB 应用程序传递到 C++ DLL 应用程序运算符(operator):
Declare Function CallMyDll ...
Sub DisplayStatus(ByVal SomeParameter As Long)
' ...
End SUb
Sub DoSomething()
Call CallMyDll(AddressOf DisplayStatus)
End Sub
一些不太明显的问题:
您必须使用
__stdcall
声明您的 C++ 函数指针calling convention . (谢谢,亚历山大 C!)在您的 VB 回调函数中,explicitly mark your parameters as by-value使用关键字
ByVal
.同样,在您的 C++ 函数指针中,不要将您的参数标记为引用。如果您想将一个字符串传递给回调,或从中检索一个字符串,您必须考虑 VB
String
s 不等于 Cchar*
小号,C++std::string
s,或微软的CString
秒。 VBString
s 必须映射到 Microsoft 相当晦涩的BSTR
数据类型。我忘记了一件非常重要的事情:您的回调必须在 VB 模块内(即,它必须是“纯函数”,而不是类或表单的方法)。强>
关于C++ DLL 可以通知调用程序它的进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5341067/