调用VB DLL的输出函数,用VB可以调用,但用C语言调用会出现非法操作,是不是只能用VB调用?
向各位前辈高手请教...
向各位前辈高手请教...
解决方案 »
- 郁闷,竟然老是提示“回答过快”,只能发贴解决问题了。
- vb中用setwindowlong函数改变窗体样式后,窗体无法自动重画,请高手解决?
- 为什么我用的activereports做的报表,每次打印时不管有纸没纸都会跳出提示“请插入纸张”,打完一张就会跳出一次,怎么取消掉啊?
- 怎样在MSFlexGrid1里删除记录呢
- 在线求教:如何读取DLL文件中的接口的一些信息?(也就是对象浏览器可以看到的信息)
- 急!!!我的程序找不到可安装的ISAM(在线等)
- 怎样判断一个PictrueBox控件装有图标?
- VB中怎样取得一台机器的系统目录?
- 请问,如何使用 ReadFile 将文件读入内存?
- 如何出现关机窗口!
- 200分急求!读取手机的信息!(进者有分!不够在加!)
- 函数如何返回多个值?
而C语言只能访问动态连接库.又因为用VB生成的DLL是COM所以会错误!
你只需要把代码移植到VC中,建立一个动态连接库工程.即可!
[email protected]
VB编译文件实际上采取了两次编译的方法,首先是调用c2.exe产生OBJ文件,然后调用Link.exe连接。如果在link的时候添加EXPORT选项,实际上是可以输出函数的。但是,在VB的工程选项中将这些屏蔽了。而且过分的是:VB在Build完成后会将OBJ文件删除,这样就无法通过Link来输出函数了。不过我找到一个比较龌鹾的变通的方法,就是先创建一个Exe工程,在Form_Load事件里面写下面的语句:
Private Sub Form_Load()
If (MsgBox("hehe", vbOKCancel) = vbOK) Then
Shell "link2.exe " & Command$
End If
End
End Sub然后编译为linktemp.exe,接下来将LINK.EXE改名为Link2.exe,将linktemp.exe改名为link.exe。这样在VB调用link.exe时会弹出对话框,处理就会中断。这时就可以有机会将OBJ文件拷贝出来了 J
然后我创建了一个ActiveX DLL工程,在这个工程里面添加一个Module并创建一个Public函数mathadd:Public Function mathadd(ByVal a As Long, ByVal b As Long) As Long
mathadd = a + b
End FunctionBuilder这个工程,在Link的时候就会中断。然后把创建的Class1.obj、Module1.obj、Project1.obj备份出来。
然后就可以调用Link2.exe连接OBJ到DLL了,我的连接代码是:
link2.exe "e:\vbdll\Class1.obj" "e:\vbdll\Module1.obj" "e:\vbdll\Project1.obj" "E:\Program Files\Microsoft Visual Studio\VB98\VBAEXE6.LIB" /ENTRY:__vbaS /EXPORT:mathadd /OUT:"e:\vbdll\ProjectOK.dll" /BASE:0x11000000 /SUBSYSTEM:WINDOWS,4.0 /VERS
注意里面的/ENTRY和/EXPORT开关,/EXPORT开关声明了输出函数mathadd。这样就大功告成了 :-D,可以被其他语言引入,例如在VB中,只需要:
Private Declare Function mathadd Lib "e:\vbdll\ProjectOK.dll" (ByVal a As Long, ByVal b As Long) As Long
就可以了。
就是调用这种VB DLL出错,你试过没?
要是有好几个函数要输出了
实际上我还没试过这个,只是偶尔看到这篇文章而已。to CHRL(陈取云) 大约可以在/EXPORT参数后面添加函数的名称吧,可能是用逗号或者分号区分开,我现在使用的机器上没有条件帮你试,抱歉了。
不过VB所使用的数据类型是VB特有的
并不是每个数据类型都和其他的语言通用
VB里long 和 integer 都和其他语言的不一样
真的?C语言可以调用?
只要是涉及对象的部分都会非法操作,一些常用控件,即使定义都不可,所以也就不能传递了.msgbox函数也会有问题
你的意思是不能用C语言调用?
那就给个源代码看看
applevb.com上没找到VC的代码
假设,vb创建的dll在c:\mydll.dll,函数名是mathadd,有两个long的参数#include <stdio.h>
#include <iostream.h>
typedef int (CALLBACK* MYPROC)(int,int);
VOID main(VOID)
{
HINSTANCE hinstLib;
MYPROC ProcAdd;
BOOL fFreeResult, fRunTimeLinkSuccess = FALSE;
// Get a handle to the DLL module.
hinstLib = LoadLibrary("c:\mydll.dll");
// If the handle is valid, try to get the function address.
if (hinstLib != NULL)
{
ProcAdd = (MYPROC) GetProcAddress(hinstLib, "mathadd");
// If the function address is valid, call the function.
if (fRunTimeLinkSuccess = (ProcAdd != NULL))
{
int rtn=ProcAdd(4,5);
cout<<rtn<<endl;
}
// Free the DLL module.
fFreeResult = FreeLibrary(hinstLib);
}
// If unable to call the DLL function, use an alternative.
if (! fRunTimeLinkSuccess)
printf("message via alternative method\n");
}
你的意思是不能用C语言调用?不,只要DLL内没有涉及类的操作,一般都没有问题。我还用Applevb.com上的方法做了一个小程序,如果你有需要,可以下载来用用,那样做这样的DLL时会轻松点。我个人觉得,这样的DLL与一个标准模块差不多,但是.....不可以操作类相关的东西....