VB 调用VC DLL 函数参数传递问题

haohaokingXP 2009-02-20 03:15:12
实际开发如下

DLLTREEMANAGER_API int __stdcall fnDllGetSubFolerNames(TCHAR* szFolderPath ,TCHAR** szFolderName_a, int *pNum)
{
FolderName* pFolderName = NULL;
FolderNode* pFolderNode = NULL , *pTemp = NULL;

pFolderNode = FolderNameList_SearchFolder(&FolderTree_pst->folderNameList, szFolderPath);

int i = 0;
for ( i = 0 ; i < pFolderNode->childFolderNum ; i++)
{
pTemp = pFolderNode->pChildFolder_a[i];
pFolderName = pTemp->pFolderName;

strcpy(szFolderName_a[i], pFolderName->szFolderName);
strcpy(szFolderName_a, pFolderName->szFolderName);
}
*pNum = i ;

return *pNum;
}


而VB中如下声明和调用

Private Declare Function fnDllGetSubFolerNames Lib "dllTreeManager.dll" (ByVal szPath As String, ByVal subFolerName As String, ByRef num As Long) As Long


Dim szSubFolderName(10) As String
Dim FolderNum, flg As Long
Dim i As Long

flg = fnDllGetSubFolerNames("C:\", szSubFolderName, FolderNum) '调用动态连接库获取子文件加的名字



后改成如下也不成

DLLTREEMANAGER_API int __stdcall fnDllGetSubFolerNames(TCHAR* szFolderPath ,TCHAR* szFolderName_a, int *pNum)
{
FolderName* pFolderName = NULL;
FolderNode* pFolderNode = NULL , *pTemp = NULL;

pFolderNode = FolderNameList_SearchFolder(&FolderTree_pst->folderNameList, szFolderPath);

int i = 0;
// for ( i = 0 ; i < pFolderNode->childFolderNum ; i++)
// {
pTemp = pFolderNode->pChildFolder_a[i];
pFolderName = pTemp->pFolderName;

// strcpy(szFolderName_a[i], pFolderName->szFolderName);
strcpy(szFolderName_a, pFolderName->szFolderName);
// }
*pNum = 1;

return *pNum;
}


而VB中如下声明和调用

Private Declare Function fnDllGetSubFolerNames Lib "dllTreeManager.dll" (ByVal szPath As String, ByVal subFolerName As String, ByRef num As Long) As Long


Dim szSubFolderName As String
Dim FolderNum, flg As Long
Dim i As Long

flg = fnDllGetSubFolerNames("C:\", szSubFolderName, FolderNum) '调用动态连接库获取子文件加的名字



DEBUG下,调用这个函数fnDllGetSubFolerNames程序出现异常,请教VB如何向VC开发的DLL传递指针的,尤其是VB中传递字符串数组到VC的DLL函数,
请大家详细讲讲,最好有详细的文档,官方的最好,谢谢大家了。
...全文
387 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
haohaokingXP 2009-03-05
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 haohaokingXP 的回复:]

追加个问题

在VB中创建一个字符串数组,传递到DLL C函数fnDllGetSubFolerNames(TCHAR* szFolderPath ,TCHAR** szFolderName_a, int *pNum)
中,fnDllGetSubFolerNames函数会将传递过来的字符串数组进行付值,请问VB如何声明和调用,谢谢
[/Quote]
帮忙回答下,好吗
Tiger_Zhao 2009-03-05
  • 打赏
  • 举报
回复
Private Declare Function fnDllGetSubFolerNames Lib "dllTreeManager.dll" _
(ByVal szPath As String, ByVal subFolerName As Long, ByRef num As Long) As Long

Dim szSubFolderName(10) As String
Dim FolderNum as long, flg As Long '<-每个变量都要指明类型
Dim i As Long

for i=0 to 10 'Unicode -> Ansi
szSubFolderName(i) = strconv(space$(256), vbFromUnicode)
next
flg = fnDllGetSubFolerNames("C:\", VarPtr(szSubFolderName(0)), FolderNum)
for i=0 to 10 'Ansi -> Unicode
szSubFolderName(i) = strconv(szSubFolderName(i), vbUnicode)
next
Cauly123 2009-02-27
  • 打赏
  • 举报
回复
C要自动完成VB字符串是比较麻烦的...
建议使用类似EnumWIndow类似的回调方式来接受字符串
haohaokingXP 2009-02-23
  • 打赏
  • 举报
回复


我没有加入_UICODE宏,应该是ANSCII的,请问楼上,关于想获取字符创数组怎么办,请看以下

[Quote=引用 3 楼 haohaokingXP 的回复:]

追加个问题

在VB中创建一个字符串数组,传递到DLL C函数fnDllGetSubFolerNames(TCHAR* szFolderPath ,TCHAR** szFolderName_a, int *pNum)
中,fnDllGetSubFolerNames函数会将传递过来的字符串数组进行付值,请问VB如何声明和调用,谢谢
[/Quote]

Tiger_Zhao 2009-02-23
  • 打赏
  • 举报
回复
类型 TCHAR 用得很恶心,它可能是 char、也可能是 WCHAR。
必须确定类型才能正确调用,如果你的确需要兼顾两种方式,参考大多数 API (比如 DrawText)的做法,分别定义以 "A"、"W" 做后缀的函数来处理两种参数方式。

在 VB 中很明确,参数声明为 ByVal szPath As String,则 VB 自动将字符串做 Unicode-Ansi 转换,对应 C 中的 char* 参数;
如果参数声明为 ByVal szPath As Long,对应 C 中的 WCHAR*,需要传入一个指针,用 StrPtr(sPath) 的方式就可以了。
Tiger_Zhao 2009-02-23
  • 打赏
  • 举报
回复
因为 VB 自动对 String 参数做 Unicode-Ansi 转换,即使声明为 ByVal 照样会回传字符串值的,参考下面的代码
Option Explicit

Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _
(ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" _
(ByVal hwnd As Long) As Long

Private Sub Form_Activate()
'KPD-Team 1999
'URL: http://www.allapi.net/
'E-Mail: KPDTeam@Allapi.net
Dim MyStr As String
'Create a buffer
MyStr = String(GetWindowTextLength(Me.hwnd) + 1, Chr$(0))
'Get the window's text
GetWindowText Me.hwnd, MyStr, Len(MyStr)
MsgBox MyStr
End Sub
haohaokingXP 2009-02-20
  • 打赏
  • 举报
回复

追加个问题

在VB中创建一个字符串数组,传递到DLL C函数fnDllGetSubFolerNames(TCHAR* szFolderPath ,TCHAR** szFolderName_a, int *pNum)
中,fnDllGetSubFolerNames函数会将传递过来的字符串数组进行付值,请问VB如何声明和调用,谢谢
haohaokingXP 2009-02-20
  • 打赏
  • 举报
回复
DLLTREEMANAGER_API int __stdcall fnDllGetSubFolerNames(TCHAR* szFolderPath ,TCHAR** szFolderName_a, int *pNum)
{
FolderName* pFolderName = NULL;
FolderNode* pFolderNode = NULL , *pTemp = NULL;

pFolderNode = FolderNameList_SearchFolder(&FolderTree_pst->folderNameList, szFolderPath);

int i = 0;
for ( i = 0 ; i < pFolderNode->childFolderNum ; i++)
{
pTemp = pFolderNode->pChildFolder_a[i];
pFolderName = pTemp->pFolderName;

strcpy(szFolderName_a[i], pFolderName->szFolderName);
/* strcpy(szFolderName_a, pFolderName->szFolderName);*/ //没有这句代码
}
*pNum = i ;

return *pNum;
}

a_rockboy 2009-02-20
  • 打赏
  • 举报
回复
szSubFolderName需要回写内容,所以你传入的字符串要初始化适当的空间。VC可不智能哦。

Dim szSubFolderName As String
szSubFolderName = space(256) //不会VB,PB是这样调用的.
ZeroMemory(szSubFolderName, 0, 256)

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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