发布网友 发布时间:2023-07-25 13:32
共1个回答
热心网友 时间:2024-12-05 01:38
将需要预留的介面定义称为全域性函式即可(非静态函式)。
一、动态连结库的介面,其本质即为动态连结库内定义的可供外部呼叫的函式。
二、除static修饰的静态函式外,其它函式均可以被其它档案呼叫,也就是任何一个非静态函式,都可以称之为动态连结库的介面。
三、为了使得使用动态连结库的开发人员了解介面的定义及呼叫方式,通畅会书写一个或一组标头档案(.h),包含如下内容:
1、供外部呼叫的所有函式的宣告。包括函式名,返回值,引数列表。
2、如果存在供外部使用的自定义资料结构,如列举,共用体,结构体等,也需要定义在标头档案中。
3、推荐在标头档案中添加注释,说明每个函式的引数的含义,何种情况下呼叫,返回值代表什么意义等。
1、封装动态连结库
首先开启VS2010新建一个win32专案(这里命名为maopao),应用程式型别选择DLL,直接点选完成即可。
下面上程式码:
View Code
编译执行,即可在Debug目录下生成maopao.lib和maopao.dll
至此气泡排序的动态连结库建立完毕。
2、呼叫动态连结库
接着就要考虑如何呼叫了
还是VS2010,新建一个控制台应用程式,并把第一步生成的库档案引入到专案中
引入方式:
专案->属性->连结器->常规->附加库目录 加入库目录
专案->属性->连结器->输入->附加依赖项 加入库名称
开启Visual Studio 2010
新建专案:档案》新建》专案
选择Visual c++》Win32 专案》输入专案名称,选择储存目录,单击“确定”按钮
进入Win32应用程式向导,单击“下一步”按钮
应用程式型别选择DLL,附加选项选择空专案,单击“完成”按钮
新增新类标头档案:在专案的标头档案目录上单击滑鼠右键》新增》新建项
已安装的模板选择Visual C++》标头档案》输入档名称,单击“新增”按钮
新增新类原始档:在专案的原始档目录上单击滑鼠右键》新增》新建项
已安装的模板选择Visual C++》c++档案》输入档名称,单击“新增”按钮
为新类新增内容。内容如下:
标头档案simpleDLL.h:
原始档simpleDLL.cpp:
可以使用吗??据我了解C# 好像不能直接使用C封装的东西吧?你去查查有没有类似的程式码??
动态连结库的使用方法,动态连结库的动态呼叫(也叫显式呼叫)可以运用了,但是静态呼叫(也叫隐式呼叫)这种很少见。
(一)先回顾一下,动态连结库和静态连结库
静态连结库:lib中的函式不仅被连线,全部实现都被直接包含在最终生成的EXE档案中,只是实现是不可见的。
动态连结库:dll不必被包含在最终的EXE中,静态呼叫时仅把函式名或者变数名或者类名连结到EXE档案中,而这些东西的实体都只有在执行时才从动态库中汇入到可执行档案中,动态呼叫的时候EXE档案执行时可以直接动态地引用和解除安装DLL档案。
同时,静态连结库中不能再包含其他的动态连结库或静态库,而动态连结库中可以包含其他的动态或静态库。
(二)回顾一下VC++支援的DLL:
DLL的编制与具体的程式语言及编译器无关,动态连结库随处可见,VC++支援三种DLL:非MFC动态库、MFC规则DLL和MFC扩充套件DLL。DLL汇出函式(或变数、类)可供应用程式呼叫;DLL内部函式只能在DLL程式内使用,应用程式无法呼叫它们。
(三)汇出函式的宣告方式:
一种在函式宣告型别和函式名之间加上“_declspec(dllexport)”。
另外一种采用模组定义(.def)档案宣告,需要在库工程中新增模组档案,格式如下:
LIBRARY 库工程名称
EXPORTS 汇出函式名
(四)DLL的呼叫方式:
静态呼叫中,由编译系统完成对DLL的载入和应用程式结束时DLL的解除安装。
动态呼叫中,由程式设计者用API函式载入和解除安装DLL(DLL载入—DLL函式地址获取—DLL释放)方式。
接下来写个例子把上面提到的理论都实践一遍。
一、 函式----建立动态连结库(MFC规则DLL)
1. New--projects--MFC AppWizard(dll)--Regular DLL using shared MFC DLL 取名为MFC_dll
2. def档案中新增:函式名(Add_new)
3. h档案中新增:外部函式宣告求和函式,函式名为Add_new
extern "C" __declspec(dllexport) int __stdcall Add_new(int a,int b);
4. cpp档案中新增: 外部函式实现
extern "C" __declspec(dllexport) int __stdcall Add_new(int a,int b)
{
return a+b;
}
5. build--set active configuration--win32 release--ok
6. 生成
7. 根目录下release资料夹中dll,lib与根目录下h档案即为所需
二、 函式----呼叫动态连结库(把MFC_dll.dll和MFC_dll.lib拷到工程所在目录)
静态呼叫(.h可以写到.cpp档案中)
1. new--projects--win32 console application--an empty project
2. 新增h档案:(test.h)
#pragma ment(lib,"MFC_dll.lib") 告诉编译器DLL相对应的lib档案所在路径和档名
extern "C" _declspec(dllimport) int _stdcall Add_new(int a,int b);宣告汇入函式
3. 新增cpp档案:(main.cpp)
#include "test.h"
int main()
{
cout<<Add_new(10,3);
return 0;
}
动态呼叫
#include <stdio.h>
#include <windows.h>
typedef int (* lpAddFun)(int ,int);定义一个与Add_new函式接受引数型别和返回值均相同的函式指标型别
int main()
{
HINSTANCE hDll;控制代码
lpAddFun addFun;函式指标
hDll=LoadLibrary("dllTest.dll");动态载入DLL模组控制代码
if(hDll)
{
addFun=(lpAddFun) GetProcAddress(hDll,"Add_new");得到所载入DLL模组中函式的地址
if(addFun)
{
int result=addFun(2,3);
printf("%d",result); } FreeLibrary(hDll);释放已经载入的DLL模组
}
return 0;
}
三、 变数----建立动态连结库(非MFC DLL)
1. new---projects---win32 dynamic-link library----an empty project(Sample)
2. 新增sample.h
#ifndef SAMPLE_H
#define SAMPLE_H
extern int dllGlobalVar;
#endif
3. 新增 sample.cpp
#include "sample.h"
#include <windows.h>
int dllGlobalVar;
bool APIENTRY DllMain(HANDLE hMole,DWORD ul_reason_for_call,LPVOID lpReserved)
windows在载入DLL时,需要一个入口函式,就如同控制台或DOS程式需要main函式、win32程式需要winmain函式一样。所以引入一个不做任何操作的预设DllMain的函式版本。是DLL的内部函式。
有一点要注意,如果看到此类巨集定义
#ifdef KSCANBAR_EXPORTS
#define KSCANBAR_API __declspec(dllexport)
#else
#define KSCANBAR_API __declspec(dllimport)
#endif
是因为这样定义一般出现在含有多个专案的解决方案中,这样可以使从 DLL 汇出更简单的巨集的标准方法。此 DLL 中的所有档案都是用命令列上定义的 KSCANBAR_EXPORTS符号编译的。在使用此 DLL 的任何其他专案上不应定义此符号。这样,原始档中包含此档案的任何其他专案都会将KSCANBAR_API 函式视为是从 DLL 汇入的,而此 DLL 则将用此巨集定义的符号视为是被汇出的。
1.先新建一个MFC DLL 工程,一般选择可扩充套件性DLL
2.接着将你的程式封装成一个类,可以用new class实现,可以是General类,也可以是已有类的子类
注意在定义这个类时,类名前要加AFX_EXT_CLASS,表示整个类可汇出
3.编译连结你的DLL,然后资料夹下会相应生成.h、.lib、.dll档案,将这三个档案copy到需要呼叫此DLL的
工程资料夹下
4.在呼叫该DLL的MFC程式中,在Project 设定选单下将.lib库新增进去,并且在MFC程式码中加入.h标头档案
printf是标准c库函式,和静态动态是不同的概念。要看编译器怎么实现了。
大部分实现应该是静态的。
你可以去看下静态和动态的区别,就知道了。
介绍 自从Windows的开始阶段动态连结库(DLL)就是Windows平台的一个组成部分。动态连结库允许在一个独立的模组中封装一系列的功能函式然后以一个显式的C函式列表提供外部使用者使用。
如果丢失,按我说的试试
第一、修复
使用腾讯电脑管家,点开电脑诊所之后,搜缺失的dll档案,会自动筛选出来,然后你只需要点立即修复即可!
第二、下载安装
根据你的系统下载(比如XP或w7),然后点开你的系统盘,点开windows这个资料夹再点开system32这个资料夹,把下载下来的dll档案复制进来就可
这个问题貌似很难,C#的dll是托管程式码,和C++中的动态连结库差别很大,可能不能直接呼叫,可以试下先用C++做一个动态连结库实现呼叫托管dll,再用java呼叫这个动态连结库吧