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

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
------解决方案--------------------
胡兄果然有大家风范,呵呵
------解决方案--------------------