C++ DLL 可以通知调用程序它的进度

标签 c++ dll com vb6 volume-shadow-service

我的老板希望我用 C++ (MSVC++2010) 编写一个 DLL,它可以执行卷影复制,他可以从 VB6(或稍后使用其他语言)调用它,并且可以在它执行时返回状态更新还没有完成。他称之为“事件”。

我有一种感觉,我终于需要学习COM了(我宁愿不...)...还有,我想到了一个回调函数,但是将函数指针从VB6移交给C++肯定是不可能的?

谁能概述一下我必须学习的内容以及如何实现,无论是否使用 COM?

编辑: 要回答一个问题,工作流程应该是:

  1. VB6 应用程序确定要备份的文件

  2. 我得到了一个路径并制作了一个包含该路径的临时卷影拷贝并返回一个挂载点(或类似的)

    • 在这一步中,我定期告诉 VB6 应用我有多远

  3. 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

一些不太明显的问题:

  1. 您必须使用 __stdcall 声明您的 C++ 函数指针calling convention . (谢谢,亚历山大 C!)

  2. 在您的 VB 回调函数中,explicitly mark your parameters as by-value使用关键字 ByVal .同样,在您的 C++ 函数指针中,不要将您的参数标记为引用。

  3. 如果您想将一个字符串传递给回调,或从中检索一个字符串,您必须考虑 VB String s 不等于 C char*小号,C++ std::string s,或微软的 CString秒。 VB String s 必须映射到 Microsoft 相当晦涩的 BSTR数据类型。

  4. 我忘记了一件非常重要的事情:您的回调必须在 VB 模块内(即,它必须是“纯函数”,而不是类或表单的方法)。

关于C++ DLL 可以通知调用程序它的进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5341067/

相关文章:

c++ - VariantChangeType 和溢出

multithreading - 在异步可插拔协议(protocol)线程中 - 如何将其关联/解析到实现::SetSite() 的特定 COM 对象?

c++ - 多重继承错误 'invalid use of incomplete type'

c# - 如何在 C# 编译的应用程序中嵌入 DLL

c++ - 一个文件的跨平台库

delphi - 如何在 Delphi 中使用 TDataset 和 Dll

C# STAThread COMException 异常

c++ - 在编译时存储默认值的优雅而有效的方法?

c++ - 当字符串包含 %2C 时,c++ 中的 std::string 不完整

c++ - 从函数返回一个分配的指针,它会导致内存泄漏吗?