我用网上流传的方法(手动使用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型啊!!!!!!!!!!!!!!!
..."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型啊!!!!!!!!!!!!!!!
解决方案 »
- 如何获得文本框多行输入时,输入焦点在屏幕上的位置
- 升一星,散我这两天攒的20分!
- 怎样抓窗口的句柄啊 ?
- 关于vfp操作word(和vba 很相似呀)除了一个问题:关闭的时候提示此文件有另一应用程序或用户使用(c:\win...\Normal.dot)
- 对话框问题
- 怎么判断串行口的数量?
- 变量未定义,why?小弟请教
- VB 数据库查询问题
- 请教用程序打开access的一个表然后添加一个字段?
- 769分高分求征:如何用asp结合winsock(vb)开发一个基于web的邮件系统,希望你能伸出援助之手,如果你有开发经验的,请讲解一下过程以及须注意的问题,还有参考哪些资料为好?肯定有分!!!!
- VB如何实现数据更新求求各位大哥大姐!帮帮我!~~~~~~~~~~
- vb如何判断excel某个单元格包含某个字符...
因为这个DLL是让一个VC程序来调用的,所以只能是这个格式。
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);
以前在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就是地址。
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;
}
参考网上的strptr、varptr、objptr函数使用方法:http://www.codesky.net/article/doc/200308/2003082134722392.htm
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
另外一个就是,你干脆去下载个vbAdvance插件,用那个东西来做你的dll,这样倒还方便点
-------------------------------------------------Public Function InputDate() As String InputDate = "abcdefg" & vbNullStringEnd Function
Public Function InputDate() As Variant
InputDate = "abcdefg"
End Function
改成以下代码即可!
Public Function InputDate() As Variant
InputDate = "abcdefg"
End Function