MyException - 我的异常网
当前位置:我的异常网» VC/MFC » VB调用VC DLL的参数有关问题:为小弟我的异常回答向

VB调用VC DLL的参数有关问题:为小弟我的异常回答向受害者致歉。散分

www.MyException.Cn  网友分享于:2013-01-31  浏览:18次
VB调用VC DLL的参数问题:为我的错误回答向受害者致歉。散分。
曾经回答过几个相似的问题,那就是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串的指针传递给函数。

前车之鉴啊,再次致歉,希望大家碰到这类问题时不要再犯错误。

------解决方案--------------------
这种态度 真认真,表扬。
------解决方案--------------------
知错就改,赞一个
------解决方案--------------------
值得表扬
------解决方案--------------------
学习
------解决方案--------------------
精神可嘉 pf
------解决方案--------------------
严重支持搂主!

VB中DLL调用不大懂。

但是像下面这种声明,虽然有extern "C",但是__stdcall照样会进行名字改编,VB中不是按函数名查找的吗?
extern "C" long __stdcall SomeFunc(LPCSTR name);
------解决方案--------------------
我是来接分的
------解决方案--------------------
不错!
------解决方案--------------------
受害者也是光荣的, 把分都给我吧!谢谢了... : )
------解决方案--------------------
学习~~
------解决方案--------------------
接分,犯错也是难免的,犯错犯多了也就习惯啦。


------解决方案--------------------
提点个人的看法,供大家参考:
VB.NET中可以指定被调用的DLL导出函数所使用的字符集,在调用时自动转换,分为Ansi、Auto、Unicode三种。
VB6以前的版本我不太了解,好象是不能指定,与Auto处理方式相同。
对于Auto方式,是根据函数名称来判断的。因为定义导出函数时用了extern "C",生成的函数名前面加了一个下划线,VB发现名字前面多了下划线后,认为该函数是C语言函数,所以自动把字符串转成了多字节形式。如果不指定extern "C",用def文件指定按原名称导出,VB应该是不做转换的(我以前试验的结果是这样)。
------解决方案--------------------
接分,胡大哥果然严谨,赞一个
------解决方案--------------------
好样的,顺便接分
------解决方案--------------------
up
------解决方案--------------------
我也学习了^^
------解决方案--------------------
我也是来接分的
------解决方案--------------------
学习这种态度,并接分
------解决方案--------------------
jf
------解决方案--------------------
胡兄果然有大家风范,呵呵
------解决方案--------------------

文章评论

5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
我的丈夫是个程序员
我的丈夫是个程序员
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
那些争议最大的编程观点
那些争议最大的编程观点
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
代码女神横空出世
代码女神横空出世
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
程序员和编码员之间的区别
程序员和编码员之间的区别
中美印日四国程序员比较
中美印日四国程序员比较
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
程序员应该关注的一些事儿
程序员应该关注的一些事儿
 程序员的样子
程序员的样子
如何成为一名黑客
如何成为一名黑客
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
每天工作4小时的程序员
每天工作4小时的程序员
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
鲜为人知的编程真相
鲜为人知的编程真相
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
漫画:程序员的工作
漫画:程序员的工作
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
编程语言是女人
编程语言是女人
老程序员的下场
老程序员的下场
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
10个调试和排错的小建议
10个调试和排错的小建议
程序员必看的十大电影
程序员必看的十大电影
旅行,写作,编程
旅行,写作,编程
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
Java程序员必看电影
Java程序员必看电影
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
程序员的鄙视链
程序员的鄙视链
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
为什么程序员都是夜猫子
为什么程序员都是夜猫子
总结2014中国互联网十大段子
总结2014中国互联网十大段子
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有