静态与动态加载Dll [示例代码]

1、DLL源代码

MyDll.h

[cpp] view plaincopyprint?

  1. ////////////////////////////////////////////////////////////////////////// 
  2. // MyDll.h 
  3. // 声明函数 
  4. int _stdcall Add(int a,int b); 
  5. int _stdcall Sub(int a,int b); 

//////////////////////////////////////////////////////////////////////////
// MyDll.h
// 声明函数
int _stdcall Add(int a,int b);
int _stdcall Sub(int a,int b);
 

MyDll.cpp

[cpp] view plaincopyprint?

  1. ////////////////////////////////////////////////////////////////////////// 
  2. // MyDll.pp 
  3. // 声明实现 
  4. #include "MyDll.h" 
  5. int _stdcall Add(int a,int b) 
  6.     return a+b; 
  7. int _stdcall Sub(int a,int b) 
  8.     return a-b; 

//////////////////////////////////////////////////////////////////////////
// MyDll.pp
// 声明实现
#include "MyDll.h"
int _stdcall Add(int a,int b)
{
return a+b;
}
int _stdcall Sub(int a,int b)
{
return a-b;
}
 

MyDll.def

[cpp] view plaincopyprint?

  1. ; MyDll为工程名 
  2. LIBRARY MyDll 
  3. ; 在这里声明需要导出的函数 
  4. EXPORTS 
  5. Add 
  6. Sub 

; MyDll为工程名
LIBRARY MyDll
; 在这里声明需要导出的函数
EXPORTS
Add
Sub
 

2、Exe测试代码

演示动态与静态加载的方法,看代码吧!

[cpp] view plaincopyprint?

  1. void CTestDlg::OnBtnStatic()  
  2.     // TODO: Add your control notification handler code here 
  3.     // 静态加载的方法: 
  4.     // 1、添加头文件 #include "MyDll.h" 
  5.     // 2、引入Lib库  #pragma comment(lib,"MyDll.lib") 
  6.     // 3、这样就可以直接使用MyDll.h中导入的函数 
  7.     CString str; 
  8.     str.Format("静态加载: 1+1=%d 1-1=%d",Add(1,1),Sub(1,1)); 
  9.     MessageBox(str); 
  10. void CTestDlg::OnBtnDynamic()  
  11.     // TODO: Add your control notification handler code here 
  12.     // 动态加载的方法: 
  13.     // 不需要引入头文件与lib文件,仅需要一个dll即可 
  14.     // 注意这里的条约调用约定_stdcall不要忘记加(不然会引会esp出错) 
  15.      
  16.     typedef int (_stdcall *ADDPROC)(int,int); 
  17.     typedef int (_stdcall *SUBPROC)(int,int); 
  18.     HINSTANCE handle; 
  19.     handle = LoadLibrary("MyDll.dll"); 
  20.     if(handle) 
  21.     { 
  22.         // GetProcAddress第二个参数有两种方法: 
  23.         // 1、通过DLL中的函数名 
  24.         // 2、通过Depend工具中Ordinal索引值来查看 
  25.         ADDPROC MyAdd = (ADDPROC)GetProcAddress(handle,"Add"); 
  26.         SUBPROC MySub = (ADDPROC)GetProcAddress(handle,MAKEINTRESOURCE(2)); 
  27.         if( !MyAdd ) 
  28.         { 
  29.             MessageBox("函数Add地址获取失败!"); 
  30.             return; 
  31.         } 
  32.         if( !MySub ) 
  33.         { 
  34.             MessageBox("函数Sub地址获取失败!"); 
  35.             return; 
  36.         } 
  37.         CString str; 
  38.         str.Format("动态加载: 1+1=%d 1-1=%d",MyAdd(1,1),MySub(1,1)); 
  39.         MessageBox(str); 
  40.     } 
  41.     FreeLibrary(handle); 
时间: 2025-01-30 08:19:26

静态与动态加载Dll [示例代码]的相关文章

C#中如何动态加载Dll

1.新建测试dll及方法,用vs2010新建winform程序,具体代码如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace reflect { public

C# 动态加载Dll

1.新建测试dll及方法,用vs2010新建winform程序,具体代码如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace reflect { public

动态加载dll,扩展系统功能

动态加载dll,主要是为了扩展功能,增强灵活性而实现的.主要通过xml配置,来获取所有要动态加载的dll,然后通过反射机制来调用dll中的类及其方法. 研究了一天,小有所得,写了一个简单的动态加载dll的通用模块,拿出来与大家分享一下: using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; using System.Text; usi

C# 如何动态加载DLL,实例化对象

问题描述 通过Activator.CreateInstance(assemblyName,typeName).Unwrap()可以实例化一个对象.但是如何动态加载DLL,然后通过Activator.CreateInstance(assemblyName,typeName).Unwrap()来实例化一个对象呢. 解决方案 解决方案二:Assemblyass=Assembly.LoadFrom("dllpath"); 解决方案三:Assembly.Load("程序集名"

Delphi语言学习9-函数的静态和动态加载

1.静态加载 procedure DoSomething; external 'MYLIB.DLL'; 2.动态加载 uses Windows, ;type TTimeRec = record Second: Integer; Minute: Integer; Hour: Integer; end; TGetTime = procedure(var Time: TTimeRec); THandle = Integer; var Time: TTimeRec; Handle: THandle; G

Silverlight动态加载DLL

问题 今天手头的项目遇到一个问题,为了描述这个问题,我建立了一个简单的项目,结构如下: 问题是这样的: 1,silverlightApplication1中有一个按钮,点击后弹出窗口:silverlightApplication6中只有一个canvas来放置从SilverlightApplication1.dll反射得到的控件. 2,silverlightApplication6中动态加载了silverlightApplication1的SilverlightApplication1.dll文件

一起谈.NET技术,Silverlight动态加载DLL

问题 今天手头的项目遇到一个问题,为了描述这个问题,我建立了一个简单的项目,结构如下: 问题是这样的: 1,silverlightApplication1中有一个按钮,点击后弹出窗口:silverlightApplication6中只有一个canvas来放置从SilverlightApplication1.dll反射得到的控件. 2,silverlightApplication6中动态加载了silverlightApplication1的SilverlightApplication1.dll文件

如果动态加载dll并继承该类,,

问题描述 如何,开发这个模块?目的给一个程序模块添加扩展,但是该模块必须开源,而且继承自该程序的类,才能执行.我已经开发好这个模块,但是我想进行加密,所以封装成dll.我当前的想法,写一个load.cs文件,来加载dll,并让load.cs文件继承封装dll中的类.求助,,,不知道该怎么实现,, 解决方案 解决方案二:怎么又要开源又是加密的?并让load.cs文件继承封装dll中的类这又是什么说法?解决方案三:MEF去了解一下说不定有用,把抽象类公开,实现类加密?解决方案四:没看懂你到底想干啥你

python动态加载变量示例分享_python

众所周知,程序在启动后,各个程序文件都会被加载到内存中,这样如果程序文本再次变化,对当前程序的运行没有影响,这对程序是一种保护. 但是,对于像python这样解释执行的语言,我们有时候会用到"from 模块 import 变量名"这样的形式,如果这个变量直接被定义在文件当中,那么这些变量在程序开始时就会被定义.赋值,运行过程中值不变.如果打算在运行过程中对这个模块进行重写,那么更改后的变量值是无法被使用的. 对于这个问题,可以换一种思路,将这个模块中的变量定义在函数里,而函数是在程序运