VB调用VC DLL的参数问题:为我的错误回答向受害者致歉。散分。

jameshooo 2008-09-18 11:11:22
加精
曾经回答过几个相似的问题,那就是VC的DLL导出函数被VB使用时如何申明的问题,本人固执地做出了错误解答,可能让提问者产生困扰,现在向受害者道歉,并纠正答案。

问题示例如下,假设VB中申明一个DLL中的导出函数为:
Public Declare Function SomeFunc Lib "test.dll" Alias "SomeFunc" (ByVal name As String) As Long
那么VC做的DLL中的导出函数原型是什么?

因为VB中的String都是UNICODE串,本人想当然地认为DLL导出函数应该这样写:
extern "C" long __stdcall SomeFunc(LPCWSTR name);

这两天搞了一个测试,发现自己错了,VB调用SomeFunc()时得不到正确的结果,最后终于发现原来想当然的东西是错误的,VB在调用DLL或者系统提供的API时,使用的都是ANSI版本的API,也就是说String参数会被自动转换成ANSI串后再作为参数调用API,如果某个串作为返回值,也是返回ANSI串后被VB转换成UNICODE,所以正确答案应该是
extern "C" long __stdcall SomeFunc(LPCSTR name);

这个问题同时引申出另一个问题,假如某个DLL的导出函数中用的是LPCWSTR作为参数,那么VB使用该函数时该如何申明和使用呢?此时不能再使用String作为参数类型了,应该换一种方式:
Public Declare Function SomeFunc Lib "test.dll" Alias "SomeFunc" (ByVal name As Long) As Long
注意这里申明的参数类型不再是String,而是Long,其实代表一个指针的值。使用的时候也需要一点技巧:
Dim name As String = "hello world"
SomeFunc(StrPtr(name))
不能直接用name作为参数,而是要用StrPtr(name)获取UNICODE串的指针传递给函数。

前车之鉴啊,再次致歉,希望大家碰到这类问题时不要再犯错误。
...全文
850 80 打赏 收藏 转发到动态 举报
写回复
用AI写文章
80 条回复
切换为时间正序
请发表友善的回复…
发表回复
juckxu 2009-04-13
  • 打赏
  • 举报
回复
正好用到。万分感谢!
liaojihei08S 2009-02-11
  • 打赏
  • 举报
回复
全是高手!
yuziyuedemsdn 2008-09-27
  • 打赏
  • 举报
回复
榜样,模范
howard_wu 2008-09-26
  • 打赏
  • 举报
回复
JF
oatn 2008-09-26
  • 打赏
  • 举报
回复
I'd like you style!
FFirX 2008-09-26
  • 打赏
  • 举报
回复
嗯,这个我也读过一些,不错,学习,谢谢
Tiger_Zhao 2008-09-26
  • 打赏
  • 举报
回复
推荐《高级Visual Basic编程》(Advanced Visual Basic)
第14章,读过该章就不会犯类似的错误。
biaozai06 2008-09-25
  • 打赏
  • 举报
回复
学习
嗷嗷叫的老马 2008-09-25
  • 打赏
  • 举报
回复
记得有句话是这样说的,'有时候经验也是导致错误的一个方面'.

学习一下.

很久没来了.

sdgegasdgdrgr 2008-09-25
  • 打赏
  • 举报
回复
向楼主学习。
xiongwangmxf 2008-09-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 thisisyjs 的回复:]
精神可嘉 p f a
[/Quote]
a
域樹臨風 2008-09-25
  • 打赏
  • 举报
回复
值得学习
PctGL 2008-09-23
  • 打赏
  • 举报
回复
vb 在调用api的之前会对 string 进行转换,这是自动的转换,属于vb自动操作的,将 unicode 转换为 ansi
http://www.vbgood.com/viewthread.php?tid=55275&highlight=
紫气东来_999 2008-09-23
  • 打赏
  • 举报
回复
这态度,没说的.
贴品好,就是人品好!
jy04610 2008-09-22
  • 打赏
  • 举报
回复
http://d.download.csdn.net/down/491318/yqh2648
真正的大侠风范啊!值得我辈学习!
Route66 2008-09-22
  • 打赏
  • 举报
回复
不錯,幫助很大,謝謝
gaogao1041 2008-09-22
  • 打赏
  • 举报
回复
http://www.chinaitpower.com/A/2005-02-02/133329.html


Step by Step: Calling C++ DLLs from VC++ and VB
一步一步教你用VC和VB调用C++ DLL.
swankie 2008-09-22
  • 打赏
  • 举报
回复
mark!
  • 打赏
  • 举报
回复
好的,学习学习,
phisherr 2008-09-21
  • 打赏
  • 举报
回复
原来如此
加载更多回复(58)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧