VC实现可在VB中调用的DLL



下面工程的骤:

1.文件--新建  新建一个 Win32 Dynamic-Link Library 的工程(在我的VC里面是倒数第二个),工程名称TextDll,当然你可以根据你的需要任意填写 , 在向导中选择空的工程

2.文件--新建  新建三个文件 TextDll.cpp(C++代码文件)
                           TextDll.h(C++头文件)
                           TextDll.def(模块定义文件,这个文件我是新建的文本文件,在文件名的                             地方直接写的TextDll.def,当然你也可以在菜单 工程--增加到工程--文                             件 处添加也可以)

3.代码

TextDll.h:

#ifdef __cplusplus
extern "C" {
#endif

__stdcall int CALLBACK Compare (int, int) ;

#ifdef __cplusplus
}
#endif


TextDll.cpp:

#include  <windows.h>
#include "TextDLL.h"

int WINAPI DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved)
{
     return TRUE ;
}

__stdcall int CALLBACK Compare (int a,int b)
{
if(a>=b)
             return a;
        else
             return b;
};

TextDll.def:


LIBRARY "TextDLL"
EXPORTS
Compare @1

好了,下面就是编译了,你可以在 组建菜单里使用组建,也可以使用直接按F7,更可以使用执行菜单,效果都是完成编译的需要~
编译完成后我们就可以测试一下,为了方便我把编译后的TextDLL放到了D盘的根目录下面,当然也可以扔到SYSTEM32下面,那样声明的时候就不用写路径了,看VB测试代码:
Private Declare Function Compare Lib "d:\TextDll.dll" (ByVal CompareA As Integer, ByVal CompareB As Integer) As Integer
Private Sub Command1_Click()
Dim a As Integer
a = Compare(1, 2)
MsgBox a
End Sub
是不是很简单呢~,呵呵,因为这只是一个测试用的工程,所以我用了最简单的表达方式,本来想写一个运算量大些的函数的,无奈自己实在想不起来什么东西了,抱歉,当然大家看完会问为什么要这样做,为什么这样写的问题,不要着急,我把在VC写DLL需要看和注意的东西都放到下面了,这些都是我在学习写DLL的时候从网络中找到的资料,希望对大家也有帮助:)

动态链接库(dll)是包含共享函数库的二进制文件,可以被多个应用程序同时使用。建立应用程序的可执行文件时,不必将DLL连接到应用程序中,而是在运行时动态装载DLL,装载时DLL被映射到调用进程的地址空间中。通常我们在调用DLL时所需的DLL文件必须位于以下三个目录之一: 
(1)Windows的系统目录:\windows\system; 
(2)DOS 中path所指出的任何目录; 
(3)程序所在的目录; 
本设计用的是第三种。 
3.2.1动态链接库(DLL)结构 
1.实现文件(.cpp文件为例) 
包含DLL入口点处理函数和导出函数,以及被导出函数调用的函数的代码。 
格式如下: 
#include "stdafx.h" //加入所使用的相关头文件 
#include "oil.h" 
#include "stdio.h" 
#include "stdlib.h" 
#include "math.h" 
BOOL APIENTRY DllMain( HANDLE hModule, 
DWORD ul_reason_for_call, 
LPVOID lpReserved 


return TRUE; 

以下为各函数:(被调用函数和导出函数之一) 
void WINAPI sub(double a, double b, double c) 
注:DLLMain 表示在Windows中DLL开始执行的地方。 
2.块定义文件(.DEF)是由一个或多个用于描述DLL属性的模块语句组成的文本文件,每个.DEF文件至少必须包含以下模块定义语句: 
第一个语句必须是LIBRARY语句,指出DLL的名字。 
EXPORTS 语句列出被导出函数的名字。 
可以使用DESCRIPTION语句描述DLL的用途(此句可选)。 
格式如下: 
EXPORTS HanL @1 
3.函数原型声明文件(.h文件为例) 
以以下格式写入: 
#ifdef _cplusplus 
extern"c" 

#endif //_cplusplus 
double WINAPI sub( double a ,double b ,double c ); //函数原型 
#ifdef _cplusplus 

#endif //_cplusplus 
注意: 
(1) c语言中须在调用函数前面声明或定义该函数,调用才能成功。在c中,函数原型通常和函数定义很相似,只不过原型以分号结尾。在c中原型仅仅用于类型检验。 
(2) 建立函数原型:.h文件。.h文件可包含c或c++模块中,正如能从ifdef 看出的一样,若代码在c文件中,则不使用extern“c”语句,但作为一个c++文件进行编译,则需要使用。 
(3)使用CPP文件(C++),则须防止C++引起的过多的名称修饰,为避免C++的名称修改,可使用extern“c”定义。extern”c”是C程序提供外部连接的方式,在C++代码中提供Visual Basic程序的链接,须使用extern”c”链接声明,这样定义的文件就可以使得其函数能被Visual Basic访问。 

还有就是一些关键字的解释,可能和上面的一些东西有重复

一、__declspec (dllexport):这是关键,它标志着这个这个函数将成为对外的接口。(以下是我在网上下载的dllexport、dllimport、_declspec的一些说明):
使用包含在DLL的函数,必须将其导入。导入操作时通过dllimport来完成的,dllexport和dllimport都是vc(visual C++)和bc(Borland C++)所支持的扩展的关键字。但是dllexport和dllimport关键字不能被自身所使用,因此它的前面必须有另一个扩展关键字__declspec。通用格式如下:__declspec(specifier)其中specifier是存储类标示符。对于DLL,specifier将是dllexport和dllimport。而且为了简化说明导入和导出函数的语句,用一个宏名来代替__declspec.在此程序中,使用的是DllExport。如果用户的DLL被编译成一个C++程序,而且希望C程序也能使用它,就需要增加“C”的连接说明。#define DllExport extern "C"__declspec(dllexport),这样就避免了标准C++命名损坏。(当然,如果读者正在编译的是C程序,就不要加入extern “C”,因为不需要它,而且编译器也不接受它)。

二、DllMain ()说明:
每一个DLL必须有一个入口点,DllMain是一个缺省的入口函数。DllMain负责初始化(Initialization)和结束(Termination)工作,每当一个新的进程或者该进程的新的线程访问DLL时,或者访问DLL的每一个进程或者线程不再使用DLL或者结束时,都会调用DllMain。但是,使用TerminateProcess或TerminateThread结束进程或者线程,不会调用DllMain。


好了就是这些了,罗罗嗦嗦就是这些了,希望对大家有些帮助~~
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值