【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 3642|回复: 0

[算法/加密解密] (zz)vc下 动态链接库的用法

[复制链接]
发表于 2007-7-27 17:57:24 | 显示全部楼层 |阅读模式
 因为一直没搞清楚如何使用dll ,所以在网上留下记录,以待学习,以后边学边改进本文吧。

目前我使用的是VS.net2003,过程如下:

一,首先描述一下如何生成一个dll

     1. "file" -> "new" -> "project" ->"Win32" -> "Win32 Console Project" ->"name"里填上新工程名字MyDll -> "Application Settings" -> 选择 Dll -> "finish" 至此新建完成。

     2. 然后在 MyDll.cpp里添加如下代码:

#define DLLIM

#ifdef DLLIM
#define DLLDIAO _declspec(dllexport)
#else
#define DLLDIAO _declspec(dllimport)
#endif

/////我只测试了一个两个数相加的函数 和一个整型数,

extern DLLDIAO int add (int i ,int j)
{
 return i + j;
}
extern DLLDIAO int mm = 12;

ok编译程序。

二,其他程序如何调用本dll

       方法很多 我尽可能的写出更多,以后学习发现新方法会补充。

方法一:

      1).就拿生成的一个 Win32 console程序吧,命名为MyDllExe,

      2).将生成的MyDll.dll复制到 \MyDllExe\Debug \目录下,将MyDll.lib复制到 \MyDllExe\目录下

      3).打开MyDllExe.cpp文件 代码如下:

#include "stdafx.h"

 #pragma comment (lib,"dlltest1.lib")

#ifdef DLLIM
#define DLLDIAO _declspec(dllexport)
#else
#define DLLDIAO _declspec(dllimport)
#endif

extern DLLDIAO int add(int i ,int j);
extern DLLDIAO int mm;


int _tmain(int argc, _TCHAR* argv[])
{
 int i = 122,j = 23,k;
 k = add(i,j);
 printf("k = %d,mm = %d\n",k,mm);
 return 0;
}

编译运行即可 发现OK!

方法二:

        就是方法一的一点点改进,

       1)注释掉 // #pragma comment (lib,"dlltest1.lib")

       2)在MyDllExe工程中在上面menu中选择 "Project" -> "add exiting item..." ->找到MyDll.lib -> "open"即可。

方法三:

       在方法一上作修改

      1)注释掉 // #pragma comment (lib,"dlltest1.lib")

      2)"Project"-> "MyDllExe Properties”-> "Linker" ->"Command Line" -> "Additional Options:" -> 添加"MyDll.lib"-> 应用确定 编译OK。

 方法四:

       跟方法一有很大的区别。

     dll生成

       1)."file" -> "new" -> "project" ->"Win32" -> "Win32 Console Project" ->"name"里填上新工程名字MyDll -> "Application Settings" -> 选择 Dll -> "finish" 至此新建完成。

       2).打开MyDll.cpp文件 代码如下:

#include "stdafx.h"


#define DLLIM
#include "MyDll.h"


DLLDIAO int add (int i ,int j)
{
 return i + j;
}
// DLLDIAO int mm = 12;
BOOL APIENTRY DllMain( HANDLE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
      )
{

    return TRUE;
}

     3)新建一个头文件命名为 "MyDll.h" 代码添加如下:

#pragma once

#ifdef DLLIM
#define DLLDIAO __declspec(dllexport)
#else
#define DLLDIAO __declspec(dllimport)
#endif

extern "C"
{
 DLLDIAO int add (int i ,int j);
}

//说明: extern ”C“ 函数好像是必须的,注释掉是不行的,原因我知道后会再来注明。

      dll调用

      4)就拿生成的一个 Win32 console程序吧,命名为MyDllExe,

      5)将生成的MyDll.dll复制到 \MyDllExe\Debug \目录下,//不需要.lib文件

      6).打开MyDllExe.cpp文件代码如下:

#include "stdafx.h"

#include <windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
 typedef int (*MYPROC)(int,int);
    HINSTANCE hinstLib;
    MYPROC ProcAdd;
 hinstLib = LoadLibrary("dlltest1.dll");
 if (hinstLib == NULL) return -1;

 rocAdd = (MYPROC) GetProcAddress(hinstLib, "add");

 if( !ProcAdd ){
  FreeLibrary(hinstLib);
  return -1;
 }

 int i = 122,j = 23,k;
 k = (ProcAdd)(i,j);
 printf("k = %d,\n",k);


 FreeLibrary(hinstLib);
 return 0;
}

附:zz

问:.def文件是什么?做dll时,不用def文件可以吗?

回答:在VC++中,如果生成DLL可以不使用.def文件。你只需要在VC++的函数定义前要加__declspec(dllexport)修饰就可以了。但是使用__declspec(dllexport)和使用.def文件是有区别的。如果你的DLL是提供给VC++用户使用的,你只需要把编译DLL时产生的.lib提供给用户,它可以很轻松地调用你的DLL。但是如果你的DLL是供VB、PB、Delphi用户使用的,那么会产生一个小麻烦。因为VC+ +对于__declspec(dllexport)声明的函数会进行名称转换

如下面的函数:

 __declspec(dllexport) int __stdcall IsWinNT()

会转换为IsWinNT@0,这样你在VB中必须这样声明:

 Declare Function IsWinNT Lib "my.dll" Alias "IsWinNT@0" () As Long

@的后面的数由于参数类型不同而可能不同。这显然不太方便。所以如果要想避免这种转换,就要使用.def文件方式。
EXPORTS后面的数可以不给,系统会自动分配一个数。对于VB、PB、Delphi用户,通常使用按名称进行调用的方式,这个数关系不大,但是对于使用.lib链接的VC程序来说,不是按名称进行调用,而是按照这个数进行调用的,所以最好给出。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2025-5-6 11:57

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表