2012-12-17 39 views
3

In my previous question,我問我爲什麼在試圖從DLL調用函數時不斷收到錯誤消息bad DLL calling convention。普遍的共識是我需要將調用約定改爲cdecl。說得通。如何在VB6中創建包裝DLL /類型庫?

不幸的是,我不能把它放在函數聲明輸入。我不得不「創建封裝器DLL」或「爲DLL創建一個類型庫」。

我對VB非常不熟悉,因爲我的工作重點是C#,這是第一次使用該語言很長一段時間。我不確定如何完成這項任務。

我也困惑包裝DLL如何幫助的東西。據說我不能在我的代碼中裝飾一個帶有cdecl的函數導入,但如果我將這個確切的函數導入到一個新的VB6 DLL中,然後引用該DLL,它會突然生效?

+0

Bob的答案中非常重要的一點是,它「突然」起作用,因爲您將包裝器編譯爲本地代碼。然後,從主程序引用該包裝器DLL,並且可以正常開發和調試。 – prprcupofcoffee

+0

您肯定無法使用typelib來解決您的cdecl問題。 – wqw

回答

4

我其實認爲this問題在這個話題上更好。

綜上所述,你可以「把它放在那裏的函數聲明進口」,但VB6 IDE不知道如何調試這樣的事情。但編譯器處理它就好了。一旦你將它編譯成一個dll,那麼你的主項目就可以訪問編譯的功能。

也許你在問如何將這些移動到一個DLL?如果是這種情況,則需要創建一個新的「ActiveX Dll」類型的項目。將其命名爲PwrUSB。接下來,添加一個類(或者如果提供了默認/空的,則將其重命名爲PwrUSBApi)。接下來,在屬性窗口中,將該類設置爲GlobalMultiUse。在一個模塊調用MDeclares,滴在所有聲明:

'from your other post... 
Public Declare Function InitPowerDevice CDecl Lib "PwrDeviceDll.dll" (ByRef firmware() As Byte) As Long 

回到你PwrUSBApi類:

'forward your calls to the dll 
Public Function InitPowerDevice (ByRef firmware() As Byte) As Long 
    InitPowerDevice = MDeclares.InitPowerDevice(firmware) 
End Function 

你可以創建一個從API更完全成熟的對象模型,但我從這個簡單的包裝開始,直到你理清了所有的API。

哦,是的,回到你的主項目中,你會添加一個引用你的新包裝PwrUSB.dll在項目菜單中。然後在代碼中,你會使用這樣的事情:

Dim numOfDevices as Long 
Dim firmware() As Byte 
Redim firmware(0 to 31) 
numOfDevices = PwrUSB.InitPowerDevice(firmware) 

祝你好運。

+0

謝謝,它爲我工作。我只需要使用VarPtr(Array(0))來傳遞指向字節數組的指針。 –

1

VB6中的包裝器DLL仍然需要使用CDecl裝飾器或者創建的Typelib來處理DLL的函數簽名。

爲此創建一個VB6包裝的唯一好處是使它更容易從VB6 IDE中調試調用程序,其中CDecl無效。包裝將會很小,並且會以原生代碼DLL的形式創建一次,從而使CDecl在那裏生效。

查看您的其他線程以獲得更多答案。我懷疑你真正的問題是你沒有通過正確的論點。