我是一名 C++ (MSVC) 作家,VB 新手,试图帮助一位以前没有做过这项任务的专家 VB.net 作家。
我们希望开发 C/C++ 和 VB 应用程序以使用用 C++ 编写的 DLL 和 C extern-ed API 函数。C++ 程序运行良好。这是我们遇到困难的VB。
DLL 提供了一个extern C
函数:
RegisterCallback( void* cbFuncPtr, void* dataPtr );
注意 1:请参阅下面的说明,了解设计更改以及我们做出此更改的原因。
注 2:附加更新添加为下面的答案。
其中回调函数有这个 C typedef:
typedef (void)(* CALL_NACK)(void*);
预计将cbFuncPtr
是一个函数指针,指向一些将被称为 CALL_BACK 的 VB 函数。dataPtr
是指向具有此 C 定义的数据结构的指针:
typedef struct
{
int retCode;
void* a_C_ptr;
char message[500];
} cbResponse_t;
哪里a_C_ptr is an internal pointer in the DLL that the VB can cast to
长`。它唯一地标识在 DLL 中进行回调的位置,并允许 VB 函数识别来自相同/不同位置的调用。
我们可以RegisterCallback()
很好地从 VB 访问和运行该函数。日志显示我们到达那里并且数据被传入。实际数据似乎是问题所在。
在阅读大约一百万个论坛条目时,我们了解到 VB 不知道指针是什么,并且 VB 结构不仅仅是有组织的内存。我们很确定 VB 结构的“地址”不是 C 认为的地址。我们已经看到反复提到“编组”和“托管数据”,但缺乏足够的理解来了解这告诉我们什么。
我们应该如何编写 VB 代码来为 DLL 提供其回调函数的执行地址,以及我们如何编写一个 VB 结构,让 DLL 可以像 C++ 那样填写?
我们是否需要一个 DLL 函数,调用应用程序可以说“C”或“VB”,并让 DLL 以不同的方式处理结构指针?如果是这样,如何编写 C 代码来填充 VB 结构?