作者macgyfu (YFU)
看板Visual_Basic
标题Re: [VB6 ] VB呼叫C DLL,变数转换问题?
时间Tue Jan 15 23:24:39 2008
※ 引述《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
1F:推 cole945:因为你用VC++编,他的int是4byte,但在VB6,Integer是2Byte 01/16 00:01
2F:→ cole945:转换时一定要注意参数type的大小~ 01/16 00:02
3F:推 cole945:对了,你从C DLL那边的unsigned short应该是2-byte,所以你 01/16 00:11
4F:→ cole945:在VB6也应该用对应的 2-byte 的Integer 来接收~, 但因为 01/16 00:11
5F:→ cole945:Integer是有号,所以超过0x7FFFF的数会因为2的补数表示法 01/16 00:12
6F:→ cole945:的关系变成负数,若是变成负数表示超过范围,加回&h10000即 01/16 00:13
7F:→ cole945:可。但Integer范围有限,所以你要改用Long array来放.. 01/16 00:14
8F:→ macgyfu:我在MSDN看到.NET有UShort的资料型态,这是VB.Net吗? 01/16 01:53
9F:→ macgyfu:VBA里面有办法使用吗? 01/16 01:55
10F:→ macgyfu:或VB6.0 01/16 01:55
11F:推 fumizuki:.NET 和 VB6 的资料型态 大小 是不一样的... 01/16 06:15
12F:推 fumizuki:unsigned short 的最大值是65536 VB6的long 是65535 01/16 06:16
13F:推 cole945:.NET的ushort是到65535(0xFFFF)才对(总之是-byte), VB6的 01/16 22:29
14F:→ cole945:Long是有号4Byte,所以值域在正负2G~ MSDN上应该已经查不到 01/16 22:30
15F:→ cole945:VB6那时的相关资料吧@.@? 用google搜 VB6和type应该比较快 01/16 22:31
16F:→ cole945:不然去灌 visual studio 6 那时的离线版的MSDN文件吧@.@ 01/16 22:32
17F:→ macgyfu:有点feeling了,灌了VB2005乱Try,之前VB6要用long在2005괠 01/16 22:35
18F:→ macgyfu:要用integer,然後在C里面用unsigned short在vb2005要用 01/16 22:36
19F:→ macgyfu:short,还蛮妙的。 01/16 22:36
20F:推 fumizuki:喔最大值我记错了 vb6 integer 32767 long 2147483647 01/17 06:38