实际开发如下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 Longflg = 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 Longflg = fnDllGetSubFolerNames("C:\", szSubFolderName, FolderNum) '调用动态连接库获取子文件加的名字DEBUG下,调用这个函数fnDllGetSubFolerNames程序出现异常,请教VB如何向VC开发的DLL传递指针的,尤其是VB中传递字符串数组到VC的DLL函数,
请大家详细讲讲,最好有详细的文档,官方的最好,谢谢大家了。

解决方案 »

  1.   

    szSubFolderName需要回写内容,所以你传入的字符串要初始化适当的空间。VC可不智能哦。Dim szSubFolderName As String
    szSubFolderName = space(256) //不会VB,PB是这样调用的.
    ZeroMemory(szSubFolderName, 0, 256)
      

  2.   

    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;
    }
      

  3.   


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

  4.   

    类型 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) 的方式就可以了。
      

  5.   

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

  6.   

    因为 VB 自动对 String 参数做 Unicode-Ansi 转换,即使声明为 ByVal 照样会回传字符串值的,参考下面的代码
    Option ExplicitPrivate 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: [email protected]
        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
      

  7.   

    C要自动完成VB字符串是比较麻烦的...
    建议使用类似EnumWIndow类似的回调方式来接受字符串
      

  8.   

    Private Declare Function fnDllGetSubFolerNames Lib "dllTreeManager.dll" _
        (ByVal szPath As String, ByVal subFolerName As Long, ByRef num As Long) As LongDim szSubFolderName(10) As String
    Dim FolderNum as long, flg  As Long '<-每个变量都要指明类型
    Dim i As Longfor 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