dll文件

qt之qmake

时光怂恿深爱的人放手 提交于 2020-04-08 12:22:00
qt之qmake qmake 10分钟学会使用qmake 创建一个项目文件 qmake使用储存在项目(.pro)文件中的信息来决定Makefile文件中该生成什么。 一个基本的项目文件包含关于应用程序的信息,比如,编译应用程序需要哪些文件,并且使用哪些配置设置。 这里是一个简单的示例项目文件: SOURCES = hello.cpp HEADERS = hello.h CONFIG += qt warn_on release 我们将会提供一行一行的简要解释,具体细节将会在手册的后面的部分解释。 SOURCES = hello.cpp 这一行指定了实现应用程序的源程序文件。在这个例子中,恰好只有一个文件,hello.cpp。大部分应用程序需要多个文件,这种情况下可以把文件列在一行中,以空格分隔,就像这样: SOURCES = hello.cpp main.cpp 另一种方式,每一个文件可以被列在一个分开的行里面,通过反斜线另起一行,就像这样: SOURCES = hello.cpp \ main.cpp 一个更冗长的方法是单独地列出每一个文件,就像这样: SOURCES += hello.cpp SOURCES += main.cpp 这种方法中使用“+=”比“=”更安全,因为它只是向已有的列表中添加新的文件,而不是替换整个列表。

C++ DLL 获取 MSI Property

99封情书 提交于 2020-04-08 06:41:46
在MSI工程中,经常会遇到这样的情况: MSI 工程需要调用DLL(C++)中的一个函数实现某些特殊或者复杂的功能,通常的做法是在Custom Action 中调用该DLL 。 那么在安装过程中,该Custom Action 被调用的时候,如何使用Visual Studio 逐行Debug DLL 的源代码呢? 答案是:使用VS2010 中的Attach to Process 就可以实现。 步骤如下: 1> VS 工程设置为Debug 模式,并设置断点。 在断点前,弹出一个 dialog ,用来标识debug的 开始位置。以 C++ DLL 获取 MSI Property 中的工程为例。 2> 以 Custom Action : dynamic link library 中的 MSI 工程为例。 编译MSI 工程,运行安装包。 3> 弹出设定的 dialog 时,在VS 工程中选择,Debug / Attach to Process… Msiexec.exe 是windows installer 服务,选择运行MessageBox 的windows installer服务,点击 ”Attach” 。 在VS 工程中,将鼠标移到断点处,可以看到工程和 msiexec.exe 已经关联了起来。 4> 继续安装,在弹出的dialog 中 点击“OK”。 再看VS 工程,程序就停在了断点处

动态链接库与静态链接库的区别

隐身守侯 提交于 2020-04-07 15:02:10
静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。静态链接库与静态链接库调用规则总体比较如下。 对于静态链接库(比较简单): 首先,静态链接库的使用需要库的开发者提供生成库的.h头文件和.lib文件。 生成库的.h头文件中的声明格式如下: extern "C" 函数返回类型 函数名(参数表); 在调用程序的.cpp源代码文件中如下: #include "..\lib.h" #pragma comment(lib,"..\\debug\\libTest.lib") //指定与静态库一起链接 第二,因为静态链接库是将全部指令都包含入调用程序生成的EXE文件中。因此如果用的是静态链接库,那么也就不存在“导出某个函数提供给用户使用”的情况,要想用就得全要!要不就都别要!:) 对于动态链接库: 动态链接库的使用需要库的开发者提供生成的.lib文件和.dll文件。或者只提供dll文件。

DLL中导出函数的两种方式(dllexport与.def文件)

巧了我就是萌 提交于 2020-04-07 13:53:14
DLL中导出函数的声明有两种方式: 一种方式是:在函数声明中加上__declspec(dllexport); 另外一种方式是:采用模块定义(.def)文件声明,(.def)文件为链接器提供了有关被链接程序的导出、属性及其他方面的信息。 方式一:在函数声明中加上__declspec(dllexport) /// 在动态链接库程序中 /// 声明动态链接库(**.dll)的对外接口函数TestFuction extern "C" __declspec(dllexport) int TestFuction(int nType,char *strPath,std::vector<string> &vecData) { ////do anything here//// return 0; } /// 在外部希望调用动态链接库的程序中 /// 加载动态链接库(**.dll)并调用其对外接口TestFuction void func() { //typedef与函数TestFuction类型相同的函数指针为TESTDLL typedef int (_cdecl * TESTDLL)(int nType,char *strPath,std::vector<string> &vecData); HINSTANCE hmod; //加载动态链接库**.dll hmod =::LoadLibrary(

acl 库

僤鯓⒐⒋嵵緔 提交于 2020-04-05 18:11:37
acl 库的功能参见文章 acl介绍 及 https://github.com/zhengshuxin/acl ,本文主要讲述如何编译和使用 acl 库。 acl 下其实有四个库:lib_acl (基础库)、lib_protocol(http 和 icmp 协议库)、lib_acl_cpp(封装了 lib_acl 和 lib_protocol 两个 C 库的 C++ 版本实现,更是增加了丰富的功能)、lib_dict(封装了 bdb, cdb, Tokyo Cabinet 库的用于字典查询的库)以及 lib_tls(封装了openssl部分功能的库,主要用于 lib_acl 的 ssl 加密传输)。其中,笔者用的最多还是 lib_acl 、lib_protocol 以及 lib_acl_cpp(目前用得最多的库)三个库,所以本文主要介绍这三个库的编译与使用。 开始时 acl 库是支持 Linux、Solaris、FreeBSD 和 Windows 平台的,其它几个平台欢迎读者进行移植。 一、Linux/UNIX 平台上编译(需要使用 gcc/g++编译器及 gnu make 命令) 1、编译 lib_acl.a 库(使用 gcc 编译器) 进入 lib_acl 目录,直接运行 make,正常情况下便可在 lib 目录下生成 lib_acl.a 静态库,用户在使用 lib_acl.a

利用反射动态创建对象

房东的猫 提交于 2020-04-04 08:42:56
前两天我发了一篇文章《 通过反射动态实例化对象中出现的一个奇怪问题 》,对反射中的某些问题疑惑不解。通过这几天不断查看MSDN,上网查询,现在终于解决了该问题。 在VS.Net中,有很多种方法动态调用对象的构造函数。一是通过Activator类的CreateInstance()方法。这个方法我们在Remoting中也用过。它实际上是在本地或从远程创建对象类型,或获取对现有远程对象的引用。它的方法签名是:public static object CreateInstance(Type);(还有其他重载方法)注意它的返回值为object,MSDN对返回值的描述是: 对新创建对象的引用。 二是通过Assembly类的方法CreateInstance()。方法名和前一样,不过它不是静态方法。Assembly是在System.Reflection命名空间中。方法签名:public object CreateInstance(Type);(同样还有其他重载方法)返回值仍然是object,MSDN对返回值的描述是: 表示该类型的 Object 的实例,其区域性、参数、联编程序和激活属性设置为空引用(Visual Basic 中为 Nothing),并且 BindingFlags 设置为 Public 或 Instance,或者设置为空引用 (Nothing)(如果没有找到 typeName)。

合并dll文件

烈酒焚心 提交于 2020-04-01 14:10:40
在使用VS进行.Net编程时,出现了一个奇怪的现象。 在一个类库项目中导入了dll库A后,再导入A的两个依赖项(dll库)B和C,执行“生成”操作时,出现错误信息,提示B和C的库版本与A所需的不一致。在应用程序中,可以编写app.config来指定B和C的版本,但在类库项目中并不自动识别app.config。 因此,如何指定A所需的B和C版本成为一个问题(仍未解决)。 后来,发现可以将ABC三个库进行合并,这样,A就不会缺少依赖库了。使用ILMerge后测试成功。可以参考:https://www.cnblogs.com/codedreams/p/5295082.html 摘录部分: 1、先下载最新的 ILMerge 工具安装包: ILMerge是合并.net的assembly的工具,最新版的支持.net 4.0的ILmerge下载: http://www.microsoft.com/downloads/details.aspx?FamilyID=22914587-b4ad-4eae-87cf-b14ae6a939b0&displaylang=en ILMerge用法示例如下: ILMerge.exe /target:library /targetplatform:v4 /out:"E:\Projects\ILMergeTest\A\Ref\AandB4.dll" "E:

zlib报“LNK2001:无法解析的外部符号”错误

我的梦境 提交于 2020-04-01 01:48:48
   这个错误一般是由使用导出dll时未加载对应的lib文件导致的,但是工程在正确配置了lib文件的情况下仍然报这个错误,经查,是由于dll导入工程和dll导出工程的函数调用约定不一致导致的。 一、函数调用约定    首先,我们由函数的调用约定说起, microsoft的vc默认的是__cdecl方式 ,而windows API则是__stdcall,如果用vc开发dll给其他语言用,则应该指定__stdcall方式。堆栈由谁清除这个很重要,如果是要写汇编函数给C调用,一定要小心堆栈的清除工作,如果是__cdecl方式的函数,则函数本身(如果不用汇编写)则不需要关心保存参数的堆栈的清除,但是如果是__stdcall的规则,一定要在函数退出(ret)前恢复堆栈。 windows有如下五种调用约定: 1.__cdecl 所谓的C调用规则。按从右至左的顺序压参数入栈,由调用者把参数弹出栈。切记:对于传送参数的内存栈是由调用者来维护的。返回值在EAX中因此,对于象printf这样变参数的函数必须用这种规则。编译器在编译的时候对这种调用规则的函数生成修饰名的饿时候,仅在输出函数名前加上一个下划线前缀,格式为 _functionname 。 2.__stdcal l 按从右至左的顺序压参数入栈,由被调用者把参数弹出栈。_stdcall是Pascal程序的缺省调用方式,通常用于Win32

MSVC 和 minGW .a .dll 等文件之间转换

风格不统一 提交于 2020-03-31 13:28:32
一、MSVC调用MINGW生成的dll和lib gcc -shared -o testdll.dll testdll.c-Wl,--output-def,testdll.def 生成dll文件和def文件 lib /machine:i386 /def:testdll.def 生成lib 文件和exp文件。(lib为MSVC的工具,可以在VS安装的bin目录下找到) 生成的dll文件和lib文件就可以被MSVC调用了。 注意:C++的dll不具有2进制级别的共享性,也就是说VC的MinGW的C++ dll不能混用。而C的dll却可以。 二、minGW调用MSVC生成的库 cl /LD testdll.c 生成dll文件和lib文件 gcc -o testmain.exe testmmain.c -ltestdll -L. 编译连接生成可执行程序 来源: https://www.cnblogs.com/lovesaber/archive/2012/11/27/2790297.html

windows下开发PHP扩展dll(无需Cygwin)

冷暖自知 提交于 2020-03-31 09:14:39
windows下开发php扩展网上很多资料都说需要Cygwin,其实完全可以不必安装该东东。没错,是可以在linux下生成骨架后拷到windos下来用,但是,如果没有linux环境呢?什么,装虚拟机?我晕,你咋又绕回去了- -! 除了编译外,shell环境主要就是为了生成扩展的骨架,其实骨架已经在php源码包中了了,我们只需要把相关名字替换一下即可使用。 准备: 1、php源码包和windows下的二进制包,以及安装Visual C++,并把Microsoft Visual Studio\Common\MSDev98\Bin的绝对路径添加到windows环境变量 2、解压源码包到d:\php_src 3、进入d:\php_src\ext目录,复制skeleton文件夹,并重命名为要开发扩展的名字,本例为“linvo” 4、把二进制包中dev目录下的php5ts.lib文件,拷入新建的linvo目录 5、编辑linvo目录中的php_skeleton.h、skeleton.c、skeleton.dsp这三个文件,替换内容中所有extname为linvo,EXTNAME为LINVO。(严格区分大小写) 编码: 6、编辑php_skeleton.h文件(头文件) 在PHP_FUNCTION(confirm_linvo_compiled);下面编写 PHP_FUNCTION(hello);