实际开发如下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函数,
请大家详细讲讲,最好有详细的文档,官方的最好,谢谢大家了。
{
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函数,
请大家详细讲讲,最好有详细的文档,官方的最好,谢谢大家了。
解决方案 »
- vb6能不能连接sql2005,比连接sql2000有什么优势呢?
- 语法问题!
- 读取txt文件,并按条件生成新的文件
- ActiveReport换页显示的问题。
- VB连接数据库之前都要设置ODBC数据源吗?
- 水晶报表连接的问题,1.做了个*.rpt文件路径为d:\xfdk\*.mdb 2.程序中调用时是在app.path\*.mdb 3.为什么在用户用户哪里还要找设计用到
- COMBOBOX 默认显示8行数据(高度), 能否让他显示16行数据?
- 如何在VB中直接嵌套SQL检索出一列的最大值?急急!!
- 如何使自定义函数的参数有常数选项?
- True DBGrid 7 中的打印事件
- 用VB6 为OLE中EXCEL赋值问题? 急急加急!
- 这样过程如何实现
szSubFolderName = space(256) //不会VB,PB是这样调用的.
ZeroMemory(szSubFolderName, 0, 256)
{
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中创建一个字符串数组,传递到DLL C函数fnDllGetSubFolerNames(TCHAR* szFolderPath ,TCHAR** szFolderName_a, int *pNum)
中,fnDllGetSubFolerNames函数会将传递过来的字符串数组进行付值,请问VB如何声明和调用,谢谢
必须确定类型才能正确调用,如果你的确需要兼顾两种方式,参考大多数 API (比如 DrawText)的做法,分别定义以 "A"、"W" 做后缀的函数来处理两种参数方式。在 VB 中很明确,参数声明为 ByVal szPath As String,则 VB 自动将字符串做 Unicode-Ansi 转换,对应 C 中的 char* 参数;
如果参数声明为 ByVal szPath As Long,对应 C 中的 WCHAR*,需要传入一个指针,用 StrPtr(sPath) 的方式就可以了。
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
建议使用类似EnumWIndow类似的回调方式来接受字符串
(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