向各位老大,高手求救,关于VB生成标准DLL后的调用问题。

StarRib 2006-04-25 07:41:28
我用网上流传的方法(手动使用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 String

InputDate的返回值总是第一位"a",上面函数改为InputDate = "1234",返回值还是第一位"1"

如果上面要是换成Long型就可以了。

老大兄弟们帮帮忙,不能换成Long型啊!!!!!!!!!!!!!!!
...全文
383 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
cdwq88 2006-11-13
  • 打赏
  • 举报
回复
拿分来
改成以下代码即可!
Public Function InputDate() As Variant
InputDate = "abcdefg"
End Function
cdwq88 2006-11-13
  • 打赏
  • 举报
回复
改成以下代码即可!
Public Function InputDate() As Variant
InputDate = "abcdefg"
End Function
kyuwong 2006-04-26
  • 打赏
  • 举报
回复
你把vc例程贴出来看看
benyfeifei 2006-04-26
  • 打赏
  • 举报
回复
char* __stdcall InputDate(int Sender, char* szDate)
-------------------------------------------------

Public Function InputDate() As String

InputDate = "abcdefg" & vbNullString

End Function
supergreenbean 2006-04-26
  • 打赏
  • 举报
回复
现有的方法一个是建个API函数的类型库,然后把金牌武器CopyMemory,字符操作lstrlen,lstrcpy以及内存分配函数GlobalAlloc添加进去,然后完全用api来操作
另外一个就是,你干脆去下载个vbAdvance插件,用那个东西来做你的dll,这样倒还方便点
StarRib 2006-04-26
  • 打赏
  • 举报
回复
huangguanshu()兄,在输出时,我应该具体如何实现呢?
StarRib 2006-04-26
  • 打赏
  • 举报
回复
还是不能解决。
kyuwong 2006-04-26
  • 打赏
  • 举报
回复
按这个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
iamxiang 2006-04-26
  • 打赏
  • 举报
回复
在写函数时使用strptr、varptr函数。
参考网上的strptr、varptr、objptr函数使用方法:http://www.codesky.net/article/doc/200308/2003082134722392.htm
StarRib 2006-04-26
  • 打赏
  • 举报
回复
这个是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;
}
StarRib 2006-04-25
  • 打赏
  • 举报
回复
多谢兄弟们的回复。

但是我用VB是在写个类似于插件的DLL程序。

VC端的代码我是没办法更改的。他们的事例程序是VC写的,函数是CHAR * 定义的。

各位兄弟帮帮忙,如何解决返回值只返回第一位??????

兄弟们救我!!!!!!!!!!!!!!!!!!!!!!
supergreenbean 2006-04-25
  • 打赏
  • 举报
回复
与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);
laidon 2006-04-25
  • 打赏
  • 举报
回复
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就是地址。
StarRib 2006-04-25
  • 打赏
  • 举报
回复
刚才吃饭去了。顶一下。
StarRib 2006-04-25
  • 打赏
  • 举报
回复
faysky2 兄弟,这样没有测试,
因为这个DLL是让一个VC程序来调用的,所以只能是这个格式。
faysky2 2006-04-25
  • 打赏
  • 举报
回复
这样呢:

Public Function InputDate(strResult As String) As Long

strResult = "abcdefg"

End Function

7,763

社区成员

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

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