把dll打包到程序中并在执行时释放

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源)

参考文档: http://blog.sina.com.cn/s/blog_5f432e6a0100uaet.html

编写MFC程序的时候,使用dependency查看依赖时,会看到有依赖MFC的库,通常都包含如下这两个:

MSCVCR100/90/80/70.dll库是一个很独立的库,它只依赖库Kenel32/kenel64

MFC100/90/80/70.dll也相对独立,依赖MSCVCR库和一些其它windows系统库,依赖相对较多一点,但在windows下一般都是有的。

但编写MFC程序时,我们希望程序能在别人的电脑上运行,就需要额外把这些库也安装到别人的机器上去了,通常有几种方法

a. 你可以发布程序的时候带上这两个依赖库一块发布。

b. 使用installshield类似工具做一个安装包

c. 把dll作为资源放到程序中,运行时释放出来,

c.1 例如使用工具(单文件制作封装工具(Enigma Virtual Box)V7.20 中文版)

c.2 自己代码实现dll释放

本次重点介绍c.2(实现dll打包到程序中并在执行时释放)的实现方法,

首先,把这个库作为资源放到工程中,例如 "DllResourc" "xxx.dll"

然后,在程序一开始的地方,把这个dll释放出来,释放方法 FindResource, LoadResource, LockResource, ResourceSize,创建文件,写文件。

样例代码如下:


Do

{

// 参考: http://blog.sina.com.cn/s/blog_5f432e6a0100uaet.html

// begin export file

// 查找资源

HRSRC hRsrc =::FindResource(AfxGetResourceHandle(), MAKEINTRESOURCE(IDR_DLLRESOURCE_VC100x86), _T("DllRESOURCE"));

DWORD dwError = GetLastError();

if(hRsrc ==NULL)

break;

// 加载资源

HGLOBAL hImgData =::LoadResource(AfxGetResourceHandle(), hRsrc);

if(hImgData ==NULL)

{

::FreeResource(hImgData);

break;

}

// 锁定内存中的指定资源

LPVOID lpVoid    =::LockResource(hImgData);

DWORD dwSize    =::SizeofResource(AfxGetResourceHandle(), hRsrc);

// 把资源数据写出到文件

CFile file;

file.Open(_T("C:\\abc.dll"), CFile::modeCreate|CFile::modeWrite);

file.Write(lpVoid, dwSize);

file.Close();

// 释放资源

::FreeResource(hImgData);

// end export file

}while(false);

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源)

时间: 2024-11-05 19:35:03

把dll打包到程序中并在执行时释放的相关文章

C#将dll打包到程序中

原文:C#将dll打包到程序中 最近比较懒,加上内容也不多就懒得排版了,字放大了,看起来应该方便一点 直接进入主题 先来看一个栗子,假设现在有一个第三方dll namespace TestLibrary1 { public class Test { public void Point() { Console.WriteLine("aaabbbccc"); } } } TestLibrary1.dll 在项目中引用,然后调用其中的方法Test,将输出aaabbbccc using Sys

C# 将dll打包到程序中

本文告诉大家如何把 dll 打包到程序中.很多时候的 软件 在运行的时候需要包括很多 dll 或其他的文件,这样的软件在给其他小伙伴,就需要做一个压缩包,或者用安装软件.这样感觉不太好,所以本文告诉大家一个方法,把所有的 dll 放在一个文件,于是把自己的软件给小伙伴就只需要给他一个程序 ILMerge 首先下载ILMerge 然后安装,感觉安装很简单 假如有 1.exe 和 1.dll 准备把 1.dll 合并到 2.exe 那么可以使用下面代码 ilmerge /target:exe /ou

将资源打包到程序中

使用vs开发qt程序有时候不希望程序使用到的图片资源让用户看到,这时可以讲资源打包到程序中. 创建qrc资源文件,里面写入你使用到的图片资源路径,下面的代码中img是文件夹 <RCC> <qresource prefix="/" > <file>img/ball.png</file> <file>img/chinapool.jpg</file> <file>img/Globe.ico</file&

解决WPF程序中ListBox ItemsSource变化时不重置ScrollBar的问题

解决WPF程序中ListBox ItemsSource变化时不重置ScrollBar的问题 当我们改变ListBox的ItemsSource时,会发现这样一个问题:数据源变化时,虽然控件中的内容会跟着变化,但滚动条却不会重置. 举个例子: 将ListBox绑定到一百个字符串:listbox.ItemsSource = Enumerable.Range(0, 100).Select(i => "## " + i);. 将ListBox的滚动条拖到最后,使之能看到最后的"#

vs 如何将dll打包到exe中

方法如下:首先需要安装NuGet 然后安装Fody.Costura 重新启动vs 编译项目即可 虽然根目录下还生成了dll但是你的程序已经可以脱离dll运行了,其实是将你的dll打入了exe中你可以看到exe的体积变大. 详细步骤参考:http://www.cnblogs.com/lonelyxmas/p/5568876.html(转自博客园) 安装包下载:https://www.nuget.org/packages/Fody/

Java程序中读取外部文件时的路径问题

转自:https://www.cnblogs.com/wt20/p/8320346.html 项目经常会读取一些配置文件, 因此getResource方法便能够起到重要作用 使用时主要是两种方法, 一个是字节码文件Class类, 另一个是ClassLoader类加载器 使用Class类时有两种使用方式: 1. 使用"/"  获取到的是classpath路径 2. 不使用"/" 这就是相对路径 ClassLoader类 没有"/"的写法, 获取到的

编写Linux中sh文件执行时出现莫名字符的问题

今天在项目中需要编写一个sh,执行一些初始化操作,然后调取原来的执行文件,但是我在操作中主要到了首行需要加入#!/bin/sh 的表达式,但是在执行时总是报错,原因是每次执行,表达式后边都会添加一个莫名奇妙的字符,最后才找到原因,是因为我用的windows编辑的文件,然后直接传到Linux运行,因为两个系统的换行符的编码不一样,所以出现在Linux下会多出一个字符,导致运行失败 可以使用 :set ff? 查询文件格式是unix的还是dos的 查了一下,确实是dos格式,然后使用以下命令,修改为

Linux--- MySQL中GRANT命令执行时发生root权限报错及解决方法

好不容易解决了root用户密码登录的问题,在给新建用户test1授权时出现了如下报错,提示root权限问题: mysql> GRANT ALL ON *.* TO 'test1'@'localhost' IDENTIFIED BY '123456';  ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) 查了网上很多方法说# mysqld_safe -u mysql --skip-

windows系统下,在C#程序中自动安装字体

在Windows系统中,原有自带的字体样式有限,有时候我们的程序会使用到个别稀有或系统不自带的字体.因此我们需要将字体打包到程序中,当程序启动时,检测系统是否有该字体,如果没有则安装该字体,也可以动态加载字体. 1.1.使用代码安装字体 注意:安装字体时,需要windows的管理员权限. [DllImport("kernel32.dll", SetLastError = true)] public static extern int WriteProfileString(string