2010-09-10 39 views
4

此問題是前一個問題的後續(here)。在C++中調用Visual Basic DLL,第2部分

我已經從第三方供應商獲得了在Visual Basic中創建的DLL(傳感器DLL.dll)。該DLL包含與傳感器對話的函數,我需要從我正在編寫的Visual C++程序中調用這些函數。供應商不會提供頭文件,我不知道Visual Basic。

我對每個函數都有少量的文檔。比如,有人告訴我一個功能(GET_DATA)在DLL的形式爲:

Public Function Get_Data(ByVal Handle As String) As String 

將返回一個字符串-16777216和16777215之間的值。就這些。

在上一問題的用戶Hans Passant給這個有用的答案:

VB6的DLL通常是一個COM服務器。你實際上有一個.h文件的等價物,它嵌入了一個類型庫。從Project + Properties,Common Properties,Framework和References開始。添加新的參考按鈕,瀏覽選項卡,選擇該DLL。

接下來,查看+對象瀏覽器。您應該在列表中看到生成的Interop庫。打開節點,看看有什麼。你編寫普通的託管代碼,比如gcnew,來創建COM對象並調用接口方法。你確實需要一些關於可用方法的最小文檔來猜測它們應該如何被調用。

根據這一意見,我確實看到的功能列表在DLL中的對象瀏覽器,包括Get_Data(System::String)但我感到困惑與COM對象,這超出了我的工作經驗。

我試圖簡單地調用Get_Data(Handle);其中Handle是BSTR現在,我已經添加了引用到我的項目,但它無法識別。我也試着先打電話給CoInitialize,但那沒有幫助。

任何人都可以告訴我具體需要寫什麼來調用函數嗎?謝謝!

+0

如果原文是'typedef PVOID Handle',那麼你應該傳遞'System.IntPtr'。除此之外,我可以重複一下漢斯所說的話:你沒有提供足夠的信息來幫助我們。你甚至沒有說出實際的錯誤信息。 – 2010-09-11 01:41:43

回答

1

如果我正確理解您的情況,您至少有一個COM對象在VB6 .dll中實現。要使用這個對象,你必須在調用方法GetData之前創建一個COM對象的實例。 CoInitialize只會初始化COM系統。您還必須使用像CoCreateInstance這樣的API。