重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这是我以前的回答,是个两数加法的例子,看了就明白了
创新互联公司服务项目包括沐川网站建设、沐川网站制作、沐川网页制作以及沐川网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,沐川网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到沐川省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
你的dll不必用h头文件,你用的是显式声明导出函数
vc在显式声明函数时会出现与vb不匹配的问题,他会把函数名改了,你必须用隐式声明,就是def文件声明才可以。
你的cpp里直接写
int __stdcall add(int a, int b)
{
return (a+b);
}
然后再在工程里添加一个文本文件,注意,文件名是 makedll(如果不对就是工程名).def
里面写
LIBRARY makedll
EXPORTS
add @1
然后保存
编译、连接
得到的dll就是vb可以调用的了
vb里呢,不用怎么改
如下
Public Declare Function add Lib "makedll.dll" (ByVal a As Integer,ByVal b As Integer) As Integer
Private Sub Command1_Click()
Dim c As Integer
c = add(1, 2)
MsgBox c
End Sub
这有就应该没问题了
函数调用有俩种情况
1:声明函数,然后直接在函数体内调用函数,这样的做法是先保存当前函数执行的地址,然后查找函数指针,找到函数声明,再找到函数实现,创建一个函数堆栈,直接在函数堆栈里面操作,然后将返回值传给主函数。然后通过之前保存的地址,继续执行之后的代码。过程比较复杂。
2:内联函数和动态库调用,这俩种方法的函数调用比较奇特,他们不会创建单独的函数堆栈,而是执行到内联函数和动态库调用区域,直接将这部分代码,类似于“粘贴”到主函数中,省去了保存当前代码执行地址,等等一系列的操作,省去了很多内存空间,增加带代码的执行效率。适合于保存一些使用频率很高的小代码。能节省很多的程序运行时间。
有对应的静态库吗?
有的话,加入项目编译,然后把动态库放到运行的地方就可以了。
如果没有的话,就需要编写代码调用了。
这里有篇比较好的文章
C的是不能直接调用C++的
你可以封装一个库
C++的,里面用extern "C"
封装函数,用这个函数调用C++的库
然后 你的C语言程序,调用这个中转库的函数就好。
比如
在你C++库里面,有一个void my_func(int)的话,直接调用my_func是不可能的
在中转库写
extern "C"{
void my_func_c(int a)
{
my_func(a);
}
}
然后在纯C程序中, 调用my_func_c就好了。
因为c++的各种复杂机制,生成的动态链接库中的符号名是不符合C的机制的,直接链接会失败,一般解决c和c++的链接问题是在c++的代码上进行处理的,只要将你的cpp文件中的函数定义都加上extern "c"前缀,就可以编译成C可链接的库。如果你只有cpp的库文件,没有源码文件的话,没法处理。
// a.cpp
extern "C" int cpp_func() { return 0; }
// b.c
#include stdio.h
int cpp_func();
int main() {
printf("%d\n", cpp_func());
return 0;
}
// ***compile and link***
// g++ a.cpp -o a.o
// gcc b.c -o b.o
// g++ a.o b.o -o a.out ./a.out
1、新建DLLTest文件夹,在该文件夹中新建source文件夹。
2、在source文件夹中造add.c。
3、win+R+cmd请出总指挥“命令行”,输入。
4、继续输入(路径也要随机应变)link /DLL /out:E:\VCfile\DLLTest\source\add.dll E:\VCfile\DLLTest\source\add.obj。
5、新建源文件call_dll.c或.cpp放到DLLTest文件夹,同时add.dll也复制过来。
6、编译,连接运行出现个5。调用成功。
注意事项:
C语言能以简易的方式编译、处理低级存储器。C语言是仅产生少量的机器语言以及不需要任何运行环境支持便能运行的高效率程序设计语言。