我是一位C++(MSVC)编写者,VB新手试图帮助一位尚未完成此任务的专家VB.net编写者。在VB中传递指向extern C函数的指针
我们希望开发C/C++和VB应用程序,以使用用C++编写的带有C语言API函数的DLL。 C++程序工作得很好。这是我们遇到困难的VB。
DLL提供一个extern C
功能:
RegisterCallback(void* cbFuncPtr, void* dataPtr);
注1:请参见下面的设计变化,我们把它的原因我的笔记。
注2:作为下面的答案添加了附加更新。
在回调函数HAVS这款C的typedef:
typedef (void)(* CALL_NACK)(void*);
的cbFuncPtr
有望成为一个函数指针一些VB函数将被调用为CALL_BACK。所述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
long`。它唯一标识DLL中回调的位置,并允许VB功能识别来自相同/不同位置的呼叫。
我们能够从VB访问和运行RegisterCallback()
功能就好了。记录显示我们到达那里并且数据被传入。这是实际的数据,似乎是问题所在。
在阅读大约一百万个论坛条目时,我们了解到VB不知道指针是什么,VB结构不仅仅是有组织的内存。我们很确定VB结构的“地址”不是C认为的地址。我们已经看到了对“编组”和“托管数据”的重复引用,但缺乏足够的理解知道这些信息告诉我们什么。
我们应该如何编写VB代码给DLL的回调函数的执行地址,以及如何编写一个VB构造,使DLL可以像C++一样填充?
我们是否需要一个DLL函数,其中调用应用程序可以说“C”或“VB”,并且DLL具有不同的结构指针处理方式?如果是这样,那么如何编写C来填充VB结构?
这[MS文章,了解如何马歇尔数据到一个DLL(http://msdn.microsoft.com/en-us/library/fzhhdwae.aspx)至少看起来像它可能适用。它被[这篇关于从VB调用C++ DLL的文章]链接到(http://social.msdn.microsoft.com/forums/en-US/Vsexpressvb/thread/4c486d10-fe8b-49da-a5f1-8054b82251ff/)。我不是一个VB或.NET程序员,所以我可能会脱颖而出。 – 2013-04-10 19:59:50
@DaveNewman这次讨论的最后一篇文章已经很有帮助。作为一名C程序员,数据可以随时随地移动,并且指向它的指针只在查询它们的语句时才被信任,是异端。猜测我将不得不在DLL侧创建结构,并告诉应用程序在哪里放置数据。这违背了让应用程序拥有数据的想法,以便尽管DLL可能会这样做,它仍然存在。 – 2013-04-10 20:41:47
据我所知,在vb.net中,选择指针的IntPtr结构是非常有用的。但是如果你已经有了一个指针定义,不确定是否真的需要。指针也可在vb.net上找到,只是有点难以找到 – Amegon 2013-04-10 20:59:11