Dll导出函数的引用参数(LPTSTR类型)在VB中用不了???

iProgram 2004-01-29 06:18:37
做了一个Dll, 是动态加载的,导出一个函数Test:

typedef enum
{
ERROR_OK,
ERROR_UNKNOWN
}TEST_ERR;

#define DLL_FUNCTION extern "C" __declspec(dllexport) TEST_ERR __stdcall

DLL_FUNCTION Test(LPTSTR lpszOut, LPCTSTR lpszIn)
{
.....
}

在VC中用LoadLibrary调用没问题,在VB中调用会导致VB环境崩溃:
Private Declare Function Test Lib "MyTest.dll" (ByRef strOut As String, ByVal strIn As String) As Long

Dim strOut as String, strIn as String
strIn="AAA"
Test strOut, strIn
MsgBox strOut

VB程序执行到Test函数就会出错.我试着写一个不含引用参数的DLL导出函数或者把Test函数在VB中的声明改成:
...(ByVal strOut As String, ...)就不会报错, 当然这样函数也没有用了.

好像问题出在LPTSTR类型的引用参数上,不解.

...全文
115 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
无我无人 2004-02-01
  • 打赏
  • 举报
回复
don't use
DLL_FUNCTION Test(LPTSTR lpszOut, LPCTSTR lpszIn)

instead, use
DLL_FUNCTION TestA(LPSTR lpszOut, LPCTSTR lpszIn)
or
DLL_FUNCTION TestW(LPWSTR lpszOut, LPCTSTR lpszIn)
iProgram 2004-01-29
  • 打赏
  • 举报
回复
好像我在VB上定义错了,ByRef 是传值, ByVal才是"传址".
我把声明变为... (ByVal strOut As String, ByRef strIn As String) As Long
然后给strOut提前分配(不知道在VB中怎么分配,我用的是赋值)就行了.
但是strIn上又有新问题:
//VB
Dim strOut As String, strIn As String
strOut = "abcdefghijklmn"
strIn = "123"
Test strOut, strIn

//VC
DLL_FUNCTION Test(LPTSTR lpszOut, LPCTSTR lpszIn)
{
int l1=strlen(lpszIn);
int l2=lstrlen(lpszIn);//also tried unicode version
此时l1和l2都不等于3 (strlen(123)==3嘛).MessageBox(lpszIn)是乱码
.....
}
这又是咋回事涅
严黎斌 2004-01-29
  • 打赏
  • 举报
回复
这样试试,在vb中,先为strIn, strOut申请或者赋值足够长的字符串空间;

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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