舉例:動態庫說明是 int ABC(int a, unsigned char b*,unsigned char *c,int *d)
入參是 a , b(約定11位元組) 出參是 c , d 關鍵是出參并沒有說明是多少位元組的。d 個值就是說明cc()的位元組個數
我是這樣宣告的
Public Declare Function JM Lib "TZhuZhanDLL.dll" (ByVal a As Long, _
ByRef b As Byte, _
ByRef c As Byte, _
ByRef d As Long) As Long
用的時候, 那個d 怎么怎么定義,我知道那個d 是傳的地址, 也是 dim forD as long 這樣嗎?
dim aa as long
dim bb(10) as byte '約定是11個位元組
dim cc() as byte '沒有約定
dim dd as long '沒有約定,這個值就是說明cc()的位元組個數
aa=1
for i =0 to 10
bb(i) = i+10 '我隨便弄得
next
bb(
select case JM( aa, bb(0), cc(0),dd)
case 0
'成功
case1
'失敗
end select
現在又是一運行到這里VB就奔潰退出,我監視也監視不了。我不明白的是,在動態庫沒有說明出參的位元組數的情況下,怎么去取值。怎么去定義那個 d ,用byref 嗎?
uj5u.com熱心網友回復:
按 “函式原型”,你在VB6中的API宣告和對應的呼叫方式,是理論上沒有問題。
但引數c是“輸出”用的,它的函式說明中,應該有“需要多大空間”的說明,
或者如何“得到需要多大空間”的說明(比如c傳入 NULL )才對啊。
不過,反過來說你的VB代碼,cc( )是動態陣列;
你在呼叫API時的“使用前”沒有分配資料空間,
應該是“下標越界”的運行時錯誤才對啊,怎么會是“行程崩潰”呢!
真有點想不明白…………
另外,在目前“不清楚需要多大”的情況下,按你的應用場景,應該也不會用到很多空間,
那么你可以事先分配一個“很富足”的空間試試看啊……
比如在呼叫API前,redim cc(1023)或者 redim cc(4095)等等。
看看能不能正常執行。
如果能正常運行,看看它用到的是多大的空間;
是“固定大小”的還是變動的(你要用不同的“輸入數”測驗)。
若是固定的,按實際需要分配;若是變動的,就使用一個“比最大值略大些”的空間數就行了。
uj5u.com熱心網友回復:
陣列cc沒初始化導致的uj5u.com熱心網友回復:
但一般來說,是應該要提示“下標越界”才對呀。
uj5u.com熱心網友回復:
不是VB自己用,API直接就往那個0還是啥的地址里寫內容了,跳過VB的錯誤捕捉了吧,應該是這樣
uj5u.com熱心網友回復:
陣列cc沒初始化導致的
但一般來說,是應該要提示“下標越界”才對呀。
不是VB自己用,API直接就往那個0還是啥的地址里寫內容了,跳過VB的錯誤捕捉了吧,應該是這樣
老馬回歸了?

我最近都很少來這兒了。
你仔細看看樓主的代碼,他把 API引數都宣告成“Byte型別參考”的;
變數cc() 是動態陣列,在呼叫JM( )前,沒有進行“Redim ”的!
這樣,在執行 select case JM( aa, bb(0), cc(0),dd) 這一句時,
首先應該是 cc(0) 這兒導致“下標越界”,無法進入API去執行的。
uj5u.com熱心網友回復:
這種“行程崩潰”,只有一種可能會發生:編譯時,選擇了“取消陣列越界檢查”,
并且要運行編譯后的exe(IDE中運行,始侄訓進行陣列越界檢查的)、
而且要API內也沒有進行“無效指標”的檢查時,才會因訪問非法記憶體導致行程崩潰。
話說……樓主都失蹤了,我們還說什么呢…………
uj5u.com熱心網友回復:
可能是函式宣告錯了;C語言函式宣告:
int ABC(int a, unsigned char *b,unsigned char *c,int *d)
VB6函式宣告:
Public Declare Function JM Lib "TZhuZhanDLL.dll" (ByVal a As Long, _
ByRef b As String, _
ByRef c As String, _
ByRef d As Long) As Long
參考:
https://blog.csdn.net/milaoshu1020/article/details/89057300
uj5u.com熱心網友回復:
更新一下,String型別的應該用ByVal;C語言函式宣告:
int ABC(int a, unsigned char *b,unsigned char *c,int *d)
VB6函式宣告:
Public Declare Function JM Lib "TZhuZhanDLL.dll" (ByVal a As Long, _
ByVal b As String, _
ByVal c As String, _
ByRef d As Long) As Long
參考:
https://blog.csdn.net/milaoshu1020/article/details/89057300
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/37021.html
標籤:API
上一篇:多個單片機測得多組電表資料通過WiFi模塊想傳給pc如何做啊?
下一篇:WORD中怎么洗掉指定字串?
