最近在參考C語言DLL的時候遇到問題,由于只給了一些函式說明,所以碰到了一些問題,向大家請教下
所給的函式說明
1、 void* __stdcall New_Object() //回傳:創建的新Panel物件的指標
VB--Public Declare Function New_Object Lib "BS7400Ctl" () As Long 宣告是否正確?void * 用什么型別來表示?作為回傳值、函式引數有什么區別么?
這樣宣告后,在vb中能回傳一個long型值
2、void __stdcall Delete_Object(void *pObject) //釋放Panel物件,pObject 就是上面回傳的Panel指標
VB--Public Declare Sub Delete_Object Lib "BS7400Ctl" (ByVal pObject As Long)
用上面的long值作為引數時,在IDE中運行時提示:94錯誤,呼叫DLL約定錯誤,但生成EXE后卻沒有錯誤提示,是這么回事?
3、DWORD __stdcall OpenReceiver(void* pObject, TRANDATAPROC pTranFunc, LPVOID pPara)
VB--Public Declare Function OpenReceiver Lib "BS7400Ctl" (ByVal pObject As Long, ByVal pTranFunc As Long, ByVal pPara As Long) As Long
引數:pTranFunc --回呼函式;pPara -- 回呼函式相關的引數指標。
這里的pPara是個什么鬼?vb中怎么宣告
請各位不吝賜教,,分可以再談
uj5u.com熱心網友回復:
初步感覺:你的1和2是沒有錯的。但如果在IDE下運行,2會出現“呼叫約定錯誤”,
請確認 Delete_Object 的函式原型是否真如你說的那樣。
在VB6中,不管什么樣的“指標”,統統都可以用 Long型別表示;
但在函式呼叫時,就要注意按函式原型來分清楚:究竟該傳值、還是“傳參考”。
“第3”: 那個pPara究竟是什么鬼,得看它的說明檔案啊。
單從函式原型來看,你的使用并沒有錯。
但第二個引數,也許你可以宣告為:[ByRef] pTranFunc as TRANDATAPROC
這樣,呼叫函式時,直接傳遞TRANDATAPROC型別的變數即可。
當然按你的“ByVal 指標”也可,只是呼叫時得用VarPtr( )取得TRANDATAPROC型別變數的地址來傳引數。
uj5u.com熱心網友回復:
暈,剛才又看了一下,才發現“第3”的第二個引數是“回呼函式”。
這“回呼函式”是一個函式地址,VB6中只能按你那樣宣告引數。
呼叫函式時,是用 AddressOf 取“回呼處理函式的地址”傳引數的。
uj5u.com熱心網友回復:
謝謝
其實1,2問中,我不明白的事為什么運行會出錯,生成EXE就不會。另外dll里函式原型我沒看到,這是第三方的,暫時還沒聯系到他們的開發人員。。。所以先在這邊問下,看 有沒有其他的可能
第3問中,我不明白的事第三個引數pPara--回呼函式引數的相關指標,這個是傳什么值
回呼函式 Public Sub RcvData(ByVal pObject As Long, ByVal sRcvData As String, ByVal iDataLen As Long)
End Sub
uj5u.com熱心網友回復:
沒看到函式原型是啥樣,這難道是你猜的引數格式?
第2個,你可以試試 Declare Function ....... as long
第3個中,那么引數要傳什么,那得是程式開發員決定的,別人能“腦補”出來???
要想弄清楚怎么用,一個就是聯系相關的技術人員或找到相關檔案資料;
另一個就是找一份“正確的應用示例”代碼。
要不然,你進行反匯編、然后分析它究竟“需要什么”!
uj5u.com熱心網友回復:
我上面寫的就是他們提供的函式原型(不過沒有示例),只是沒有看到dll里的具體東西。。然后我也不了解是不是還有其他的情況導致這個問題,所以來這邊請教下大家。。
先謝謝了,我想辦法聯系下他們開發人員問問看

uj5u.com熱心網友回復:
不要做A語言代碼修改為B語言代碼的無用功。也不要做用A語言代碼直接呼叫B語言代碼庫這樣復雜、這樣容易出錯的傻事。
只需讓A、B語言代碼的輸入輸出重定向到文本檔案,或修改A、B語言代碼讓其通過文本檔案輸入輸出。
即可很方便地讓A、B兩種語言之間協調作業。
比如:
A將請求資料寫到檔案a.txt,寫完后改名為aa.txt
B發現aa.txt存在時,讀取其內容,呼叫相應功能,將結果寫到檔案b.txt,寫完后洗掉aa.txt,改名為bb.txt
A發現bb.txt存在時,讀取其內容,讀完后洗掉bb.txt
以上A可以替換為任何一種開發語言或開發環境,B可以替換為任何一種與A不同的開發語言或開發環境。
除非A或B不支持判斷檔案是否存在、檔案讀寫和檔案更名。
但是誰又能舉出不支持判斷檔案是否存在、檔案讀寫和檔案更名的開發語言或開發環境呢?
可以將臨時檔案放在RamDisk上提高效率減少磨損磁盤。
資料的結構很復雜的話,文本檔案的格式問題可參考json或xml
共享臨時文本檔案這種行程之間的通訊方法相比其它方法的優點有很多,下面僅列出我現在能想到的:
·行程之間松耦合
·行程可在同一臺機器上,也可跨機,跨作業系統,跨硬體平臺,甚至跨國。
·方便除錯和監視,只需讓第三方或人工查看該臨時文本檔案即可。
·方便在線開關服務,只需洗掉或創建該臨時文本檔案即可。
·方便實作分布式和負載均衡。
·方便佇列化提供服務,而且幾乎不可能發生佇列滿的情況(除非硬碟空間滿)
·……
“跨語言、跨機,跨作業系統,跨硬體平臺,跨國,跨*.*的”苦海無邊,
回頭是“使用共享純文本檔案進行資訊交流”的岸!
uj5u.com熱心網友回復:
唉,木有辦法呢,用的是人家的DLL
而且估計很少會有人照你說的去做吧。。個人或者開源的東西可能還好說
所以,再苦再累也得受著
uj5u.com熱心網友回復:
那是“機器人回復”,你別當真……
估計在這論壇里能找到幾千貼這種“一字不差”的回復了。
看起來似乎“很有道理的樣子”,但實際是“然并卵”,
按我的評價,他這就是基于幼兒園的水平、方法、思路,去處理所有遇到的問題。

uj5u.com熱心網友回復:
不要做A語言代碼修改為B語言代碼的無用功。
也不要做用A語言代碼直接呼叫B語言代碼庫這樣復雜、這樣容易出錯的傻事。
只需讓A、B語言代碼的輸入輸出重定向到文本檔案,或修改A、B語言代碼讓其通過文本檔案輸入輸出。
即可很方便地讓A、B兩種語言之間協調作業。
比如:
A將請求資料寫到檔案a.txt,寫完后改名為aa.txt
B發現aa.txt存在時,讀取其內容,呼叫相應功能,將結果寫到檔案b.txt,寫完后洗掉aa.txt,改名為bb.txt
A發現bb.txt存在時,讀取其內容,讀完后洗掉bb.txt
以上A可以替換為任何一種開發語言或開發環境,B可以替換為任何一種與A不同的開發語言或開發環境。
除非A或B不支持判斷檔案是否存在、檔案讀寫和檔案更名。
但是誰又能舉出不支持判斷檔案是否存在、檔案讀寫和檔案更名的開發語言或開發環境呢?
可以將臨時檔案放在RamDisk上提高效率減少磨損磁盤。
資料的結構很復雜的話,文本檔案的格式問題可參考json或xml
共享臨時文本檔案這種行程之間的通訊方法相比其它方法的優點有很多,下面僅列出我現在能想到的:
·行程之間松耦合
·行程可在同一臺機器上,也可跨機,跨作業系統,跨硬體平臺,甚至跨國。
·方便除錯和監視,只需讓第三方或人工查看該臨時文本檔案即可。
·方便在線開關服務,只需洗掉或創建該臨時文本檔案即可。
·方便實作分布式和負載均衡。
·方便佇列化提供服務,而且幾乎不可能發生佇列滿的情況(除非硬碟空間滿)
·……
“跨語言、跨機,跨作業系統,跨硬體平臺,跨國,跨*.*的”苦海無邊,
回頭是“使用共享純文本檔案進行資訊交流”的岸!
唉,木有辦法呢,用的是人家的DLL
而且估計很少會有人照你說的去做吧。。個人或者開源的東西可能還好說
所以,再苦再累也得受著
那是“機器人回復”,你別當真……
估計在這論壇里能找到幾千貼這種“一字不差”的回復了。
看起來似乎“很有道理的樣子”,但實際是“然并卵”,
按我的評價,他這就是基于幼兒園的水平、方法、思路,去處理所有遇到的問題。
為什么人和人溝通主要用說話;而不是用眼神、手勢、體感、……呢?!
uj5u.com熱心網友回復:
你這個問題,我弄個,只是VB,VC函式都是我自己寫。你這個問題,相當于直接呼叫VB類模塊函式,傳給VC 引數時,都傳long,VC函式自己做型別轉換
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/69967.html
標籤:API
