VC写的动态链接库函数:
void __stdcall Fun(char** p)
{
...//函数体内,p开僻了新空间,并给空间赋了新值
}在VB里应如何声明,如何调用?我这么写的:
声明:
Private Declare Sub Fun Lib "myDll.dll" (ByVal p As Long)
Private Declare Function VarPtr Lib "MSVBVM60" (var As Any) As Long调用程序:
     Dim s As String
    Fun VarPtr(s)但结果s仍为空值,感觉Fun函数对s变量没影响。
请问我哪里错了,应如何写????在线等,急~~~~~~~

解决方案 »

  1.   

    Private Declare Sub Fun Lib "myDll.dll"(ByRef p As Long) Dim s As Long
    fun VarPtr( s )
    然后你再CopyMemory复制出来吧
      

  2.   


    Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
    Public Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As Long) As Long
    Private Declare Sub Fun Lib "myDll.dll"(ByRef p As Long) 
    Dim p As Long 
    fun VarPtr( p ) Dim L As Long
    L = lstrlen(lp)
    Dim s As String
    s = String$(L + 1, vbNullChar)
    CopyMemory s, lp, Ls '就是参数的字符串了顺便说一下,DLL不建议使用这种类型的参数.
      

  3.   

    试了楼上的代码,s还是空的,还有lp应该是p吧。先声明,我的DLL在VC下测试是没问题的。因为C的指针用起来方便
      

  4.   

    那就试试用Byte数组咯Private Declare Sub Fun Lib "myDll.dll"(p As Any)Dim s(255) As Byte
    Dim ss As String
    Call Fun(ByVal s(0))
    ss = StrConv(s, vbUncode) '或者vbFromUncode
      

  5.   

    // CDll.cpp#include<windows.h>BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
    {
    return true;
    }void __stdcall Alert(char** p)
    {
    MessageBox(NULL, *p, "Alert", MB_OK);    // 注意变量类型声明是char**
    }// CDll.defEXPORTS
    Alert @1' Form1.frm(VB6代码)Option ExplicitPrivate Declare Sub Alert Lib "CDll.dll" Alias "#1" (ByRef p As Long)Private Sub Command1_Click()
        Dim p As Long
        Dim s As String
        Dim t As String
        
        s = "Hello"
        t = StrConv(s, vbFromUnicode)
        p = StrPtr(t)
        Alert p
    End Sub
      

  6.   

    搞出来的一部分Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, ByVal Source As Long, ByVal Length As Long)
    Public Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As Long) As Long
    Private Declare Sub Func Lib "dlltest.dll" (ByRef p As Long)
    Sub main()Dim lp As Long
    Func lpDim L As Long
    L = lstrlen(lp)ReDim Buf(L) As Byte
    CopyMemory Buf(0), lp, L ' 这样buf里面就是实际的字符串内容,我往string中复制老出问题End Sub
      

  7.   

    谢谢大家,
    Hassle 的代码最直接简单明了。
      

  8.   

    akirya 辛苦了,你的代码有点能实现的样子(字符串中有需要的值),只是极易出错,VB程序退出,我还没摸懂是怎么回事
      

  9.   

    在解决方案资源管理器中-引用,应将Dll文件引用进来就可以直接用了