c语言dll写法
- 格式:doc
- 大小:36.59 KB
- 文档页数:2
动态连接库最大的特点就是能节省磁盘空间.当多个进程共享同一个DLL的时候,内存中只有一个DLL的代码.通过映射来使各个进程得以调用.1.用VC建立一个WIN32 DLL我们利用VC编写DLL有几种方法.如果用VC建立一个WIN32 DLL 工程.那这个工程就应该只导出C++的类或全局变量.和全局函数.方法就是在CPP文件中编写你的代码,为每个需要导出的元素进行导出办法是增加如下语句:_declspec(dllexport)你当然可以把它定义成宏例如,如果是一个类STUDENT需要导出, 那么声明时应该是这样写class _declspec{dllexport) student;当然也可以定义时直接导出.我们的客户端,也就是我们调用该函数的客户程序,就需要导入这个类或者函数..填写如下语句:class _declspec(dllimport) student{} // 声明之后就可以利用STUDENT来构造对象,也可以调用它的成员函数..了记住,一定要把工程的连接设置好.要把生成的LIB文件填写好,因为客户程序要想加载DLL,能够准确的调用各个DLL中的函数,都是靠这个LIB文件哪.包括函数的地址等等.当然也可以显示连接利用LOADLIBRARY原型是HMODULE LoadLibrary( LPCTSTR );返回的HMODULE就是一个DLL句柄.所以我们在利用这个句柄来作为参数调用另一个函数GETPROCADDRESSFARPROC GetProcAddress( HMODULE , LPCSTR); //如果利用序号来索引,那么要加上MAKEINTERSOURCE宏返回一个函数指针,利用它来调用函数,LPCSTR是函数名,但你应该利用DUMPBIN来查看一下你导出的函数名,因为C++编译器支持重载,它会以自己的方式重命名.除非你用extern \"C\"用C语言的方式来命名函数.例如一个函数void fun();导出格式应该是extern \"C\" _declspec(dllexport) void fun(); //如果是声明导入函数,直接写原型,如果是声明类,那么一定要是类的头文件声明,包含了成员函数和数据成员的.注意即使是采用了C语言命名方式如果你改变了调用方式_stdcall 那么还是会改变函数命名的,除非你利用DEF文件来导出.EXPORTSfun这样是可以的.2.建立一个MFC扩展DLL扩展DLL是为了更好的支持MFC的类.你建立这个工程后会自动生成一些代码,不要管它先,你把你要动态连接的CPP和相应的.H文件加入到工程,在.CPP文件中需要导出的类上加上AFX_EXT_Class 在.H需要导入的类上加上同样的代码,这样就可以了.例如class AFX_EXT_CLASS CSTUDENT : public CPERSON //.CPP{}class AFX_EXT_CLASS CSTUDENT ; //.H{} //声明3.建立一个常规的DLL如果你要建立扩展的DLL,那么其他的IDE是无法利用的,因为每个编译器的命名方式是不同的.如果你想使其他IDE来调用VC的DLL,那么就建立一个常规的DLL.建立工程以后,编写你要导出的类.例如extern \"C\" _declspec(dllexport) void fun(){AFX_MANAGE_STA TE(AfxGetStaticModuleState( ));}在为每一个需要导出的函数的开头加上这条语句. [Page]在客户端要加上导入语句就可以了.。
C语⾔编译成dll
⾸先c语⾔在开始要加上
#ifdef __cplusplus
extern "C" {
#endif
…被导出的⽅法名称
#ifdef __cplusplus
}
#endif
不然系统会将起当做c++,转成的dll中的⽅法名称会被转义。
在实现的⽅法名称前⾯加上__declspec(dllexport)
1. Gcc:gcc –shared -o xxxx.dll xxxx.c 可以直接将.c⽂件转成dll⽂件。
在实际引⽤中,我是将所有的#include都是放在.c⽂件中的,上述的注意代码也是放在.c中的,他的头⽂件是直接抛弃掉了。
2. Vc创建⼀个c++的项⽬,⽂件-新建-新建项⽬-其他语⾔-Visual C++ - Win32 控制台应⽤程序;勾选DLL和导出符号,.c需要修改
成.cpp,右键-属性-预编译头-不使⽤预编译头,右击项⽬“重新⽣成”。
1实地使⽤过确认可以使⽤,2未尝试过但是在使⽤c++转出dll是没有问题的
在导出过程中我们可以使⽤vs⾃带⼀个⼯具来查询⽣成的dll中有那些⽅法,例如:
Vs安装路径下:C:\vs 2012\VC\bin\dumpbin.exe,可能会报⼀个缺少“mspdb110.dll”⽂件的错误,直接将安装路径下:C:\vs
2012\Common7\IDE下⾯的该⽂件复制粘贴到C:\vs 2012\VC\bin\下⾯。
⽤法是,先cd到dumpbin的路径下,dumpbin –exports xxxx.dll。
1、搜索下载解压缩melp的C语言源程序http://health.tau.ac.il/Communication%20Disorders/noam/speech/melp/Download/Download.htm2、打开Visual Studio 2010,新建一个工程接下来弹出如下界面,点击OK选择Next选择Application type DLL,最后点击Finish3、建立MELP工程,首先删除不需要的MELP.cpp文件,也可以不删除的。
打开该工程所在的文件夹弹出如下界面复制第一步下载解压缩的MELP的源代码到本工程的目录。
如下图。
4、添加上一步的文件到工程弹出如下界面,全选所有的文件,然后放弃图中标示的那三项,点击Add添加完毕后就会如下图所示了,然后双击打开melp.h文件,和melp.c文件,这是我们需要更改的两个程序,其他都不需要改变的。
5、对melp.h文件的添加,打开melp.h,把如下程序写入到原始文件的最下面#ifndef LIB_H#define LIB_Hextern_decl spec(dllexport) void cmd_melp(int argc, char **argv);extern_decl spec(dllexport) void melp_encoder_ini();extern_decl spec(dllexport) void melp_encoder(short speechIn720[],char result27[]);extern_decl spec(dllexport) void melp_encoder720s(short speechIn720s[],int times,char result27s[]);extern_decl spec(dllexport) void melp_decoder_ini(); extern_decl spec(dllexport) void melp_decoder( char inChar27[],short *speechOut720);extern_decl spec(dllexport) void melp_decoder27s( char inChar27s[],int times,short *speechOut720s);#endif添加完毕后,如下图所示关于上述文件添加的原因,可以参见如下的博客/bubifengyun/blog/96252 6、对melp.c文件的修改和添加先修改melp.h的位置添加melp.h文件中声明函数的函数体。
用C++进行DLL编程入门一、编写第一个入门级dll文件1. 新建一个dlltest的dll工程,加入一源文件dlltest.cpp,包含add和subtract两个函数如下:_declspec(dllexport) int add(int a,int b){return a+b;}_declspec(dllexport) int subtract(int a,int b){return a-b;}//----------------------------------------------------------------注意:在函数名前加上_declspec(dllexport),这样编译后在连接的时候才会生成dlltest.lib (引入库文件)和dlltest.exp(输出库文件),并且在命令提示符下用dumpbin命令可以看到导出了哪些函数。
方法:在命令提示符下,转到dll文件所在目录下,输入dumpbin –exports dlltest.dll,列出导出函数如下:这里注意到函数名字已经被改成了?add@@YAHHH@Z,这种现象叫做名字粉碎,是为了支持函数重载而做的。
2.编写一个基于对话框的MFC程序测试DLL,工程名为calldll,放置两个按纽add和subtract,响应按纽消息,调用这个DLL的add和subtract函数。
先添加响应按钮消息的函数OnAdd和OnSubtract,然后在函数所在源文件中写完整函数体如下://extern int add(int,int);//extern int subtract(int,int);_declspec(dllimport) int add(int,int);_declspec(dllimport) int subtract(int,int);void CCalldllDlg::OnAdd(){// TODO: Add your control notification handler code hereCString str;str.Format("2+3=%d",add(2,3));MessageBox(str);}void CCalldllDlg::OnSubtract(){// TODO: Add your control notification handler code hereCString str;str.Format("3-2=%d",subtract(3,2));MessageBox(str);}//------------------------------------------------------------这里采用隐式链接的方式加载动态链接库:注意:要用关键字extern先声明这两个函数,表明这两个函数是在外部定义的(不过程序中将它注释掉了)。
c++ dll之间传递结构C++ DLL(动态链接库)是一种可包含函数、数据和资源的二进制文件格式,可以供其他程序在运行时动态加载和调用。
在DLL之间传递结构是一种常见的需求,可以通过以下几种方式实现。
1. 使用结构指针传递这是一种简单且常见的方式,即在DLL函数之间传递结构指针。
在调用方定义一个结构,并将其地址传递给DLL函数。
DLL函数可以通过指针访问和修改结构的成员。
示例:调用方(DLL1)定义结构:```typedef struct {int value;char name[20];} MyStruct;extern "C" __declspec(dllexport) void DLLFunction(MyStruct* pStruct);```DLL函数(DLL2)接收结构指针:```extern "C" __declspec(dllexport) void DLLFunction(MyStruct* pStruct) {// 访问结构成员pStruct->value = 10;strcpy(pStruct->name, "example");}```调用方调用DLL函数并传递结构指针:```MyStruct myStruct;DLLFunction(&myStruct);```这种方法的优点是简单明了,但需要调用方和DLL之间共享结构定义。
2. 使用二进制流传递如果结构较为复杂或者需要传递的数据量较大,可以使用二进制流在DLL之间传递结构。
调用方将结构序列化为二进制流,并将其传递给DLL函数。
DLL函数可以解析二进制流并还原成结构。
示例:调用方(DLL1)将结构序列化为二进制流:```MyStruct myStruct = {10, "example"};// 将结构序列化为二进制流std::ostringstream oss;oss.write(reinterpret_cast<char*>(&myStruct), sizeof(myStruct)); std::string data = oss.str();// 将二进制流传递给DLL函数DLLFunction(data.c_str(), data.size());```DLL函数(DLL2)解析二进制流:```extern "C" __declspec(dllexport) void DLLFunction(const char* data, size_t size) {assert(size == sizeof(MyStruct));// 解析二进制流并还原结构MyStruct myStruct;memcpy(&myStruct, data, sizeof(myStruct));// 访问结构成员myStruct.value = 20;strcpy(, "example2");}```这种方法可以灵活地传递结构,但需要在调用方和DLL之间定义结构的布局和大小。
C编写通达信Dll动态库文件之前都是用MFC写通达信用DLL文件,MFC基本属于被淘汰工具,正好昨天新装VS2019,就试着用VS2019 C++动态库编写通达信用的DLL文件。
操作步骤如下:1.打开VS2019,新建一个项目,项目名称tdxDllTest,,新建项目时选择“动态链接库”,如下图:选择DLL项目名称:tdxDllTest新建的项目2.在新建项目中添加通达信DLL编程规范中的文件,此例是将规范中三个文件合并成两个,操作见下图:工程项目名称右键---添加---现有项,(需先将规范中实例的文件加入项目中)添加文件添加头/源文件3.在PluginTCalcFunc.cpp源文件中修改代码如下图:添加修改功能函数函数放入全局数组4.源代码:PluginTCalcFunc.h头文件:#ifndef __PLUGIN_TCALC_FUNC#define __PLUGIN_TCALC_FUNC#pragma pack(push,1)//函数(数据个数,输出,输入a,输入b,输入c)typedef void(*pPluginFUNC)(int,float*,float*,float*,float*);typedef struct tagPluginTCalcFuncInfo{unsigned short nFuncMark;//函数编号pPluginFUNC pCallFunc;//函数地址}PluginTCalcFuncInfo;typedefBOOL(*pRegisterPluginFUNC)(PluginTCalcFuncInfo**);//===================================== ==#ifdef __cplusplusextern 'C'{#endif //__cplusplus__declspec(dllexport) BOOL RegisterTdxFunc(PluginTCalcFuncInfo** pFun);#ifdef __cplusplus}#endif //__cplusplus#pragma pack(pop)#endif====================================== =PluginTCalcFunc.cpp源文件#include 'pch.h'#include 'PluginTCalcFunc.h'/*typedef void(*pPluginFUNC)( int DataLen,float* pfOUT,float* pfINa,float* pfINb,float* pfINc)类型指针;函数参数分别是(数据个数,输出,输入a,输入b,输入c),参数的计算是基于长度为DataLen 的float类型数组。
Windows下C语⾔调⽤dll动态链接库dll是windows下的动态链接库⽂件,下⾯记录⼀下在windows下如何调⽤C语⾔开发的dll动态链接库。
1.dll动态链接库的源代码hello_dll.c#include "stdio.h"_declspec(dllexport) void test_print(char const *str){printf("%s\n", str);}_declspec(dllexport) int test_add(int a, int b){return a + b;}上⾯的代码定义了两个函数,第⼀个函数需要传⼊⼀个字符串,然后打印出这个字符串,第⼆个函数需要转⼊两个int型整数,然后返回这两个整数的和。
执⾏ cl -LD hello_dll.c 会⽣成hello_dll.dll⽂件2.main函数的源代码test_hello_dll.c#include <stdlib.h>#include <windows.h>int main(int argc, char const *argv[]){// define two functional pointervoid(*p_test_print)(char const *) = NULL;int(*p_test_add)(int, int) = NULL;int add_result;// load dll file, require window.h fileHMODULE module = LoadLibraryA("hello_dll.dll");if (module == NULL) {system("error load");}p_test_print = (void(*)(char const *))GetProcAddress(module, "test_print");p_test_add = (int(*)(int, int))GetProcAddress(module, "test_add");if (p_test_print != NULL) {p_test_print("Hello This is from dll");} else {system("function p_test_print can not excute");}if (p_test_add != NULL) {add_result = p_test_add(5, 5);printf("Add result is %d\n", add_result);} else {system("function p_test_print can not excute");}FreeLibrary(module);system("pause");return0;}执⾏ cl test_hello_dll.c 会⽣成test_hello_dll.exe的可执⾏⽂件。
C#如何⽣成dll⽂件,并在项⽬中引⽤dll⽂件第⼀步⽣成dll⽂件⾸先我们要先创建⼀个⼯程:我们在⼯程中先添加⼀个控制台项⽬:其次我们在创建⼀个类库项⽬:在类库项⽬中的类,我们写上函数,类和函数都必须⽤public来修饰。
其中namespace后⾯的名称就是后⾯调⽤dll时,在程序中需要using的名称。
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace MyTest{public class Class1{public void show(){Console.WriteLine("Hello Wrold!");}}}写完后我们右击该项⽬属性,看输出类型是否为类库。
选中项⽬,点击栏⽬中的⽣成菜单,点击红框中的⽣成。
⽣成的dll⽂件在这个⽬录下。
第⼆步:引⽤该dll⽂件。
选中第⼀步中创建的控制台⼯程的--->引⽤---->添加引⽤,选择浏览,到刚刚的⽬录下去找dll⽂件。
:添加成功后,我们可以在引⽤⽬录下看到我们引⽤的dll:接下来就是引⽤dll⽂件,打开控制台程序类,先添加using,如图所⽰。
然后在main函数中就可以直接调⽤dll⽂件中的类了。
using System;using System.Collections.Generic; using System.Linq;using System.Text;using System.Threading.Tasks; using MyTest;namespace ConsoleApplication1 {class Program{static void Main(string[] args) {Class1 cl = new Class1(); cl.show();Console.ReadKey();}}}最后实验结果,如图所⽰。
C调用C的DLL搜集整理的所有数据类型转换方式在C语言中,调用DLL是一个常见的操作。
DLL(Dynamic Link Library)是一种动态链接库,包含了被多个应用程序共享的函数和数据。
而在C语言中,进行数据类型转换是很常见的需求。
本文将为您介绍C调用C的DLL时,常用的数据类型转换方式的搜集整理。
1. 整型与字符型之间的转换当我们在C程序中需要将整型数值转换为字符型时,可以使用C语言提供的itoa()函数。
该函数将整数转换为字符串,并存储在指定的字符数组中。
示例代码如下:```int num = 123;char str[10];itoa(num, str, 10);```而当我们需要将字符型数值转换为整型时,可以使用C语言提供的atoi()函数。
该函数将字符串转换为整数。
示例代码如下:```char str[] = "123";int num = atoi(str);```2. 整型与浮点型之间的转换在C程序中,整型与浮点型之间的转换是常见的操作。
当我们需要将整型转换为浮点型时,可以使用强制类型转换操作符来实现。
示例代码如下:```int num = 123;float fnum = (float)num;```而当我们需要将浮点型转换为整型时,可以通过强制类型转换实现。
注意,转换过程中会丢失小数部分。
示例代码如下:```float fnum = 123.45;int num = (int)fnum;```3. 字符型与浮点型之间的转换在C程序中,字符型与浮点型之间的转换也是常见的需求。
当我们需要将字符型转换为浮点型时,可以使用强制类型转换操作符来实现。
示例代码如下:```char ch = '1';float fnum = (float)(ch - '0');```而当我们需要将浮点型转换为字符型时,可以使用sprintf()函数。
c语言dll写法
在C语言中,编写DLL(动态链接库)的基本步骤如下:
1. 定义导出函数或变量:使用__declspec(dllexport)关键字将需要导出的函数或变量声明为导出符号。
例如:
```c
__declspec(dllexport) void MyFunction()
{
// 函数实现
}
```
2. 编译源代码:使用C编译器将源代码编译为目标文件。
例如,使用GCC 编译器可以使用以下命令:
```shell
gcc -c -DBUILD_DLL
```
这将生成一个名为的目标文件。
3. 创建DLL项目:使用链接器将目标文件链接为DLL。
例如,使用GCC编译器可以使用以下命令:
```shell
gcc -shared -o
```
这将生成一个名为的DLL文件。
4. 使用DLL:在其他C语言程序中,使用__declspec(dllimport)关键字导
入DLL中的导出符号。
例如:
```c
__declspec(dllimport) void MyFunction();
```
然后在程序中使用该函数或变量即可。
注意,在使用DLL时需要确保DLL
文件与应用程序位于同一目录中,或者在系统路径中添加DLL文件的路径。
以上是编写C语言DLL的基本步骤。
需要注意的是,具体的实现方式可能
会因编译器和操作系统而有所不同。