Re: [VB6 ] VB呼叫C DLL,變數轉換問題?

看板Visual_Basic作者 (YFU)時間17年前 (2008/01/15 23:24), 編輯推噓6(6014)
留言20則, 3人參與, 最新討論串3/3 (看更多)
※ 引述《fumizuki (矇面加菲獅)》之銘言: : ※ 引述《macgyfu (YFU)》之銘言: : : Hi : : 小弟最近嘗試要用VB呼叫dll來用,基本上那些dll我都用VC++使用過 : : ,但是用VB呼叫了幾個發現了一些問題,C的function常常包含了unsigned short : : ,unsigned char和xxx(unsigned short array[10])這種要傳array的型態,遇到 : : 這種問題不知道要怎麼處理? : 用相近的型態來替代吧 : unsingned short → long : unsingned char → string 說到這個我覺得奇怪,在C code裡面如果是xx(int x)的話,在VB我要用ByVal x as Long 才有辦法跑,不然就直接或沒有反應,然後unsigned short我也用long想跑過,但是執行 到這一步程式就會當掉,有上網google了幾個,似乎有幾篇文章有提到類似的問題,但還 再研究中,因為我是要丟變數給dll,不知道格式要不要在修改過? 謝謝你的回答 我在研究看看 : 陣列用傳址的方式... : VB6有提供這三個函數可以取得變數位址 : strPtr(), varPtr(), objPtr() : 函數的位址 AddressOf xxxx() : WindowsAPI 的 CopyMemory() 可以進行記憶體操作o.o : (不過這是危險的動作,操作不當是會直接關掉程式的...) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.217.155.31

01/16 00:01, , 1F
因為你用VC++編,他的int是4byte,但在VB6,Integer是2Byte
01/16 00:01, 1F

01/16 00:02, , 2F
轉換時一定要注意參數type的大小~
01/16 00:02, 2F

01/16 00:11, , 3F
對了,你從C DLL那邊的unsigned short應該是2-byte,所以你
01/16 00:11, 3F

01/16 00:11, , 4F
在VB6也應該用對應的 2-byte 的Integer 來接收~, 但因為
01/16 00:11, 4F

01/16 00:12, , 5F
Integer是有號,所以超過0x7FFFF的數會因為2的補數表示法
01/16 00:12, 5F

01/16 00:13, , 6F
的關係變成負數,若是變成負數表示超過範圍,加回&h10000即
01/16 00:13, 6F

01/16 00:14, , 7F
可。但Integer範圍有限,所以你要改用Long array來放..
01/16 00:14, 7F

01/16 01:53, , 8F
我在MSDN看到.NET有UShort的資料型態,這是VB.Net嗎?
01/16 01:53, 8F

01/16 01:55, , 9F
VBA裡面有辦法使用嗎?
01/16 01:55, 9F

01/16 01:55, , 10F
或VB6.0
01/16 01:55, 10F

01/16 06:15, , 11F
.NET 和 VB6 的資料型態 大小 是不一樣的...
01/16 06:15, 11F

01/16 06:16, , 12F
unsigned short 的最大值是65536 VB6的long 是65535
01/16 06:16, 12F

01/16 22:29, , 13F
.NET的ushort是到65535(0xFFFF)才對(總之是-byte), VB6的
01/16 22:29, 13F

01/16 22:30, , 14F
Long是有號4Byte,所以值域在正負2G~ MSDN上應該已經查不到
01/16 22:30, 14F

01/16 22:31, , 15F
VB6那時的相關資料吧@.@? 用google搜 VB6和type應該比較快
01/16 22:31, 15F

01/16 22:32, , 16F
不然去灌 visual studio 6 那時的離線版的MSDN文件吧@.@
01/16 22:32, 16F

01/16 22:35, , 17F
有點feeling了,灌了VB2005亂Try,之前VB6要用long在2005괠
01/16 22:35, 17F

01/16 22:36, , 18F
要用integer,然後在C裡面用unsigned short在vb2005要用
01/16 22:36, 18F

01/16 22:36, , 19F
short,還蠻妙的。
01/16 22:36, 19F

01/17 06:38, , 20F
喔最大值我記錯了 vb6 integer 32767 long 2147483647
01/17 06:38, 20F
文章代碼(AID): #17ZD0uVF (Visual_Basic)
文章代碼(AID): #17ZD0uVF (Visual_Basic)