VS之动态库实现和调用

程序开发中,经常会使用到动态库,那么动态库该如何实现和调用呢?本文通过一个简单的例子实现。

使用工具:VS2008

使用语言:C++

开发步骤:

1.新建动态库程序

1.1新建调用类和类中函数的动态库

新建类,在.h和.cpp文件顶部分别添加定义,并在类名前加上导出标志

DllFunc.h

#pragma once

#ifdef MY_DLL_EXPORTS
#define MY_DLL_API __declspec(dllexport)
#else
#define MY_DLL_API __declspec(dllimport)
#endif

class MY_DLL_API CDllFunc
{
public:
	CDllFunc(void);
	~CDllFunc(void);
public:
	void Show(void);
};

DllFunc.cpp

#include "StdAfx.h"
#include "DllFunc.h"

#ifndef MY_DLL_EXPORTS
	#define MY_DLL_EXPORTS
#endif

CDllFunc::CDllFunc(void)
{
}

CDllFunc::~CDllFunc(void)
{
}

void CDllFunc::Show(void)
{
	AfxMessageBox(_T("静态加载动态库"));
}

1.2新建接口类动态库

新建类,在.cpp文件顶部添加接口函数

extern "C"
__declspec(dllexport) void CreateObject()
{
//	*pObj = new CEcu;
	AfxMessageBox(_T("动态加载动态库"));
}

2.新建动态库调用程序

新建一个对话框应用程序,添加两个按钮,分别用于静态和动态调用动态库

2.1动态加载动态库

2.1.1添加动态库.dll

2.1.2加载动态库并调用动态库函数

void CDllUseDemoDlg::OnBnClickedBtnDllInfo()
{
	HINSTANCE hIn = NULL;
	hIn = LoadLibrary(_T("DllCreateInfoDemo.dll"));

	if(hIn != INVALID_HANDLE_VALUE)
	{}
	else
	{
		MessageBox(_T("Load DLL error"));
		return;
	}

	typedef void (*LPFNREGISTER)();

	LPFNREGISTER pFun = NULL;

	char p[256] = {0};
	CString str = _T("CreateObject");
	int cnt = str.GetLength();
	for(int i=0; i<cnt; i++)
	{
		p[i] = str.GetAt(i);
	}
	pFun = (LPFNREGISTER)GetProcAddress(hIn,p);

	(*pFun)();

	FreeLibrary(hIn);
}

2.1.3效果如下

2.2静态加载动态库

2.2.1添加动态库.h .lib .dll并导入头文件.h到工程中

2.2.2标识需要加载的.lib文件

#include"DllFunc.h"
#pragma comment(lib,"DllCreateFuncDemo.lib")

2.2.3直接使用类调用函数

void CDllUseDemoDlg::OnBnClickedBtnDllFunc()
{
	CDllFunc dll;
	dll.Show();
}

2.2.4效果如下

源码下载

时间: 2025-01-07 15:06:52

VS之动态库实现和调用的相关文章

Live555 中的客户端动态库.so的调用方式之一 程序中调用

1.  打开动态链接库:    #include <dlfcn.h>    void *dlopen(const char *filename, int flag);    该函数返回操作句柄,如:    void *pHandle = dlopen(strSoFilePath, RTLD_LAZY); 2.  取动态对象地址:    #include <dlfcn.h>    void *dlsym(void *pHandle, char *symbol);    dlsym根据

关于动态库之间stl调用的问题

最近在做cocos2dx的自更新,因为一开始没有选择用lua,所以现在不得不找其他出路来做自更新. 当然直接的想法就是把逻辑丢到一个动态库里面,框架部分加一个资源管理ok.然后问题就来了 一开始在4.4的android设备上测试,一切正常,但是拿到4.0.4的机器上就直接崩溃了,anrdoid调试起来很困难,弄了很久也没搞定,放弃. 第一个症状,初始化LabelAtlas时挂掉,挂的很尴尬,看不出理由的(至少当时是这样),看着好像内存被写乱了,但是怎么也查不到. 然后瞎折腾了半天,居然找到了一个

c++动态库封装及调用(1、动态库介绍)

1.一个程序从源文件编译生成可执行文件的步骤: 预编译 -->  编译 -->  汇编 --> 链接 (1)预编译,即预处理,主要处理在源代码文件中以"#"开始的预编译指令,如宏展开.处理条件编译指令.处理#include指令等. (2)编译过程就是把预处理完的文件进行一系列词法分析.语法分析.语义分析以及优化后生成相应的汇编代码文件. (3)汇编是将汇编代码转变成二进制文件. (4)链接将二进制文件链接成一个可执行的命令,主要是把分散的数据和代码收集并合成一个单一的

Linux链接库三(C跟C++之间动态库的相互调用)

http://www.cppblog.com/wolf/articles/74928.html http://www.cppblog.com/wolf/articles/77828.html http://www.jb51.net/article/34990.htm C和C++之间库的互相调用 extern "C"的理解:很多人认为"C"表示的C语言,实际并非如此,"C"表示的是一种链接约定,只是因C和C++语言之间的密切关系而在它们之间更多的应

Android底层笔记:APP通过JNI调用动态库.so

开发环境: 平板电脑:FSPAD-733,原理上来说任何支持安卓的开发板都可以: eclipse:使用的是iTOP-4412开发板提供的eclipse安卓开发包: Ubuntu:使用的是FSPAD-733虚拟机开发环境,原理上来说任何开发包提供的虚拟机环境都是可以的. 加载库名,然后系统自动到库目录下找.so动态库 目录/库文件名 loadLibrary ? ? ? du -mh tags androidL/art/ vi -t Runtim_nativeLoad ? ? ? javah -jn

静态库和动态库的使用

1.静态库使用比较简单,就两步 @1包含静态库头文件#include "文件名" @2预处理加载静态库 #pragma comment(lib,"库文件名") 2.再看动态库 @1首先得有动态库文件,将动态库文件放在源码目录(不然后面加载得传入文件路径),这是我的动态库源文件内容 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<windows.h> 4 5 //导出函数,加载

linux主文件和动态库之间变量和函数访问

通常我们需要从动态库里面直接调用可执行程序中的函数和变量,如果调用了-l选项,linux进程会自动把动态库的函数和变量加入到动态段中,所以直接访问是没有问题的. 我们这里要说的是非显示连接动态库,而是直接从c文件中通过dlopen函数打开动态库访问的方式,此时,gcc编译器不知道SO需要调用哪一个函数,所以不会讲函数放到动态段.故查找函数或者变量的时候,会出现找不到可执行程序中的符号的情况. 为什么会出现需要在c文件中直接dlopen动态库的情况呢? 这种情况一般出现在又不想重启进行,又需要有功

Android WebView加载Chromium动态库的过程分析

Chromium动态库的体积比较大,有27M左右,其中程序段和数据段分别占据25.65M和1.35M.如果按照通常方式加载Chromium动态库,那么当有N个正在运行的App使用WebView时,系统需要为Chromium动态库分配的内存为(25.65 + N x 1.35)M.这是非常可观的.为此,Android使用了特殊的方式加载Chromium动态库.本文接下来就详细分析这种特殊的加载方式. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注! 为什么当有

linux 动态库插件技术(c/c++):动态链接库

概述 插件技术的目的是为了更好的扩展性.动态链接库是其中 一种实现方式. 这里主要论述几个问题. 1)linux上关于这些api的描述.看完linux上关于dlopen等函数的描述基本就可以写出简单的动态链接库使用. 2)关于c++使用动态链接库的一些问题和注意事项. 3)扩展,编译器的各选项,动态链接库和静态链接库. linux api:dlopen,dlsym,dlerror,dlclose 摘自ubuntu kylin 14.04,内核3.13.0-32generic #include<d