VC++ 写Dll和调用

http://blog.sina.com.cn/s/blog_4b3485000100w64p.html

先转过来 下来再看

 

目的:我们用vc写一个非常简单的AddTest.dll,它封装了一个sum函数,然后我们在另外一个程序中调用AddTest.dll.采用显示链接。

     (一)写AddTest.dll

     1.新建一个project->win32 dynamic link library,命名为AddTest, finish.

     2.新建一个c/c++ head file,命名为SumMath.h,其代码为:

         extern "C" __declspec(dllexport)     int fun(int x1,int x2,int x3);

     3.新建一个SumMath.cpp,其代码为:

       #i nclude "AddMath.h"

      extern "C" __declspec(dllexport) int fun(int x1,int x2,int x3)

      {

                    return x1+x2+x3;

        }

      4.保存,build,这样我们就在AddTest工程目录下的Debug文件中得到AddTest.dll文件。

 

分析上面的程序我们可以看出,对Dll的调用分为一下几步:
首先,语句typedef int ( * lpAddFun)(int,int)定义了一个与add函数接受参数类型和返回值均相同的函数指针类型。随后,在main函数中定义了lpAddFun的实例addFun;
  其次,在函数main中定义了一个DLL HINSTANCE句柄实例hDll,通过Win32 Api函数LoadLibrary动态加载了DLL模块并将DLL模块句柄赋给了hDll;
  再次,在函数main中通过Win32 Api函数GetProcAddress得到了所加载DLL模块中函数add的地址并赋给了addFun。经由函数指针addFun进行了对DLL中add函数的调用;
  最后,应用工程使用完DLL后,在函数main中通过Win32 Api函数FreeLibrary释放了已经加载的DLL模块。
在上面的例子中我们看到了由系统API提供的三位一体“DLL加载-DLL函数地址获取-DLL释放”方式,这种调用方式称为DLL的动态调用。
  动态调用方式的特点是完全由编程者用 API 函数加载和卸载 DLL,程序员可以决定 DLL 文件何时加载或不加载,显式链接在运行时决定加载哪个 DLL 文件。
同样,还存在静态调用的方式。静态调用方式的特点是由编译系统完成对DLL的加载和应用程序结束时 DLL 的卸载。当调用某DLL的应用程序结束时,若系统中还有其它程序使用该 DLL,则Windows对DLL的应用记录减1,直到所有使用该DLL的程序都结束时才释放它。静态调用方式简单实用,但不如动态调用方式灵活。
下面我们来看看静态调用的例子,将编译dllTest工程所生成的.lib和.dll文件拷入dllCall工程所在的路径   (二)在另外一个console程序中调用AddTest.dll

       1.新建一个win32 concole application,名为Test.

       2.新建一个test.cpp文件。其代码为:

#i nclude <iostream>

#i nclude <windows.h>

//---------1、动态调用类库--------------------------------------------
typedef int (_cdecl *DllAddMath)(int,int,int);      //声明一个函数指针,可以指向dll中的函数
//2、静态调用类库
#pragma comment(lib,"AddTest.lib")
extern "C"__declspec(dllimport) int fun1(int x,int y);

int main()

{

//--1、动态调用类库---------由系统API提供的三位一体“DLL加载-DLL函数地址获取-DLL释放”方式,这种调用方式称为DLL的动态调用。

 HINSTANCE hdll=::LoadLibrary(_T("AddTest"));//载入dll

 //获取dll的函数指针,并强制转换为先前typedef的函数指针

 DllAddMath dllMath=(DllAddMath)::GetProcAddress(hdll,"fun");       

 int tmp=dllMath(1,2,3);

 std::cout<<"测试vc中使用dll的结果为:"<<tmp<<std::endl;

 //释放dll的句柄

 ::FreeLibrary(hdll);

//2、静态调用类库

int result = fun1(2,3);
 printf("%d",result);
 cout<<endl;

 return 0;

}

     这个时候保存,并运行,就会看到结果为:

   测试vc中使用dll的结果为:6

(三)在C#中调用

在引用中添加AddTest.dll

 

using AddTest;

private void button2_Click(object sender, EventArgs e)
        {
            int xx=AddTest.fun(1, 2, 3);
            MessageBox.Show(xx.ToString());
        }

        public static class AddTest
        {
            [DllImport("AddTest", EntryPoint = "fun")]
            public static extern int fun(int x1, int x2, int x3);
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值