我用网上流传的方法(手动使用link.exe+参数)生成可输出函数的DLL。
..."F:\Temp\test\dll\Module1.OBJ" "F:\Temp\test\dll\Class1.OBJ" "F:\Temp\test\dll\testdll.OBJ" "E:\tools\Microsoft Visual Studio\VB98\VBAEXE6.LIB" /ENTRY:__vbaS /OUT:"F:\Temp\test\dll\testdll.dll" /BASE:0x11000000 /SUBSYSTEM:WINDOWS,4.0 /VERSION:1.0  /DEF:"F:\Temp\test\dll\testdll.DEF" /DLL  /INCREMENTAL:NO /OPT:REF /MERGE:.rdata=.text /IGNORE:4078 ...DEF文件如下:
NAME testdll
LIBRARY Module1
DESCRIPTION "Add-on Library of Mathematical Routines"
EXPORTS DllMain @1
        InputDate @2在DLL中InputDate函数如下:
Public Function InputDate() As String    InputDate = "abcdefg"End Function
+++++++++++++++++++++++++++++++++++++++++++
问题
+++++++++++++++++++++++++++++++++++++++++++
Public Declare Function InputDate Lib "F:\Temp\test\dll\testdll.dll" () As StringInputDate的返回值总是第一位"a",上面函数改为InputDate = "1234",返回值还是第一位"1"如果上面要是换成Long型就可以了。老大兄弟们帮帮忙,不能换成Long型啊!!!!!!!!!!!!!!!

解决方案 »

  1.   

    这样呢:Public Function InputDate(strResult As String) As Long    strResult = "abcdefg"End Function
      

  2.   

    faysky2 兄弟,这样没有测试,
    因为这个DLL是让一个VC程序来调用的,所以只能是这个格式。
      

  3.   

    与vb里面的String相对应的是BSTR类型,你的函数相当于
    BSTR InputDate();在C里面只要用CString或者BSTR来接收结果便可以了
             typedef BSTR (__stdcall *fnInputDate)();
    ......
             HMODULE hmod=LoadLibrary("C:\\test.dll");
    fnInputDate InputDate=(fnInputDate)GetProcAddress(hmod,"InputDate");
    CString result(InputDate());
    FreeLibrary(hmod);
    MessageBoxEx(NULL,result,"",MB_OK,NULL);
      

  4.   

    VB中的String实际上是地址,是字串的首地址(注意:不是长度的首地址) 
    以前在VB中使用VC的DLL时,在声明中可以使用long返回,然后用lstrcpy进行转换
    同样,我觉得可以lstrcpy这个API将这个string的地址long返回,其实你上面声明为long可用就是这个原因,返回后再将这个地址上的string返回,不过既然你是在VC上用直接声明成long也行啊,在VC中用CString*也可以啊。
    注意一点:API声明时
    Public Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long 
    两个参数中的任意一个string的都可写为long,这个long就是地址。
      

  5.   

    多谢兄弟们的回复。但是我用VB是在写个类似于插件的DLL程序。VC端的代码我是没办法更改的。他们的事例程序是VC写的,函数是CHAR * 定义的。各位兄弟帮帮忙,如何解决返回值只返回第一位??????兄弟们救我!!!!!!!!!!!!!!!!!!!!!!
      

  6.   

    这个是VC DLL的例子程序:
    char* __stdcall InputDate(int Sender, char* szDate)
    {
    char *result = NULL; //input date format yymmdd
    if (strlen(szDate) >= 6)
    {
    char szFormatedDate[50] = ""; sprintf(szFormatedDate, "<20%c%c-%c%c-%c%c>\0", \
    szDate[0], szDate[1], szDate[2], szDate[3], szDate[4], szDate[5]); result = strdup();
    }
    else
    {
    result = strdup("<Demo>");
    }
    return result;
    }
      

  7.   

    在写函数时使用strptr、varptr函数。
    参考网上的strptr、varptr、objptr函数使用方法:http://www.codesky.net/article/doc/200308/2003082134722392.htm
      

  8.   

    按这个vc例子在vb可以这样声明函数
    char* szdate在输入时可以看成byref szdate as byte
    在输出时,由于vb没有指针类型,所以只能声明为 as long
    最后返回值时用 inputdate = varptr(bytearray(0)) 这里的bytearray应该用全局数组
    当然还可以用其他方法,但vb alloc的内存可能在vc中不能free。
    function InputDate(byval sender as long,byref szdate as byte)as long
       if strlen(szdate)>=6 then
         '代码
       else
         '代码
       end if
    end function
      

  9.   

    huangguanshu()兄,在输出时,我应该具体如何实现呢?
      

  10.   

    现有的方法一个是建个API函数的类型库,然后把金牌武器CopyMemory,字符操作lstrlen,lstrcpy以及内存分配函数GlobalAlloc添加进去,然后完全用api来操作
    另外一个就是,你干脆去下载个vbAdvance插件,用那个东西来做你的dll,这样倒还方便点
      

  11.   

    char* __stdcall InputDate(int Sender, char* szDate)
    -------------------------------------------------Public Function InputDate() As String    InputDate = "abcdefg" & vbNullStringEnd Function
      

  12.   

    改成以下代码即可!
    Public Function InputDate() As Variant
        InputDate = "abcdefg"
    End Function
      

  13.   

    拿分来
    改成以下代码即可!
    Public Function InputDate() As Variant
        InputDate = "abcdefg"
    End Function