VB调用VC DLL的参数问题
2009-04-29 19:27
323 查看
问题示例如下,假设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串的指针传递给函数。
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串的指针传递给函数。
相关文章推荐
- (原创)VB调用DLL(VC)使用结构体参数时的内存对齐及分配的问题.
- VB调用VC++的DLL问题:1.无法返回参数,2.找不到入口点
- VB调用VC++的DLL问题:原因可能是托管的PInvoke 签名与非托管的目标签名不匹配。请检查PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。
- vb.net调用vc动态库时传递数组参数应注意的问题
- VB调用C DLL时的参数传递问题
- VB中调用vc++ DLL文件中的函数问题
- C# 要调用VC++ DLL时参数问题请看这个
- VB调用C# DLL 传递数组参数问题
- c#的调用VC的dll输出参数的问题
- 关于delphi调用vc编写的dll中参数类型有关问题
- VB调用vc写的dll的某个方法时的问题
- 请问Delphi调用VC写的dll,有传入和传出参数都是unsigned char*运行中有有关问题
- java调用vc++ dll时无法加载的问题
- c# 调用 vc++ dll 的问题总结
- C#调用VC的DLL的接口函数参数类型转换一览表
- vb调用vc++dll文件
- VB中的String类型调用VC的DLL
- vb调用vc编的dll文件
- vb 中调用用vc dll
- vb.net 调用c++dll的 字符串传递问题