C++ DLL,可以通知调用程序其进度

Fel*_*bek 2 c++ vb6 com dll volume-shadow-service

我的老板要我用C++编写一个DLL(MSVC++ 2010),它可以执行卷影复制,他可以从VB6(或以后的其他语言)调用它,并且可以在未完成时返回状态更新.他称之为"事件".

我觉得我最终需要学习COM(我宁愿不......)...而且,我想到了一个回调函数,但是从VB6到C++的函数指针肯定是不可能的?

有人可以概述我必须学习什么以及如何在有或没有COM的情况下实现这一目标?

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

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

  2. 我有一个路径并制作一个临时的卷影副本,其中包含此路径并返回一个挂载点(或类似的)

    • 在这一步中,我经常告诉VB6应用程序我有多远

  3. VB6应用程序备份卷影副本,然后删除卷影副本.

pyo*_*yon 5

您可以使用AddressOf运算符将指向VB应用程序的"显示进度"功能指针传递给C++ DLL应用程序:

Declare Function CallMyDll ...

Sub DisplayStatus(ByVal SomeParameter As Long)
    ' ...
End SUb

Sub DoSomething()
    Call CallMyDll(AddressOf DisplayStatus)
End Sub
Run Code Online (Sandbox Code Playgroud)

一些不那么明显的陷阱:

  1. 您必须使用__stdcall 调用约定声明您的C++函数指针.(谢谢,Alexandre C!)

  2. 在VB回调函数中,使用关键字将参数显式标记为按值ByVal.同样,在C++函数指针中,不要将参数标记为引用.

  3. 如果要将字符串传递给回调,或从中检索字符串,则必须考虑VB String不等于C char*s,C++ std::string或Microsoft CString.VB String必须映射到Microsoft相当模糊的BSTR数据类型.

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