我是一位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