用C/C++编写与调用动态链接库(DLL)文件
来源:互联网 发布:mac图片批处理软件 编辑:程序博客网 时间:2024/06/11 20:28
下面是C创建与调用DLL的:
dll 的源码 testdll.c
[Copy to clipboard]
CODE:#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define DLLIMPORT __declspec (dllimport)
#endif /* Not BUILDING_DLL */
/*定义了一个 dll 函数 addxy,返回2个数的和*/
DLLIMPORT int addxy ( int x, int y)
{
return (x+y);
}
BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ ,
DWORD reason /* Reason this function is being called. */ ,
LPVOID reserved /* Not used. */ )
{
switch (reason)
{
case DLL_PROCESS_ATTACH: /*dll 进程加载的时候执行的事情*/
break;
case DLL_PROCESS_DETACH: /*dll 进程卸载的时候执行的事情*/
break;
case DLL_THREAD_ATTACH: /*dll 线程加载的时候执行的事情*/
break;
case DLL_THREAD_DETACH: /*dll 线程卸载的时候执行的事情*/
break;
}
/* Returns TRUE on success, FALSE on failure */
return TRUE;
}
#include <stdio.h>
#include <stdlib.h>
#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define DLLIMPORT __declspec (dllimport)
#endif /* Not BUILDING_DLL */
/*定义了一个 dll 函数 addxy,返回2个数的和*/
DLLIMPORT int addxy ( int x, int y)
{
return (x+y);
}
BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ ,
DWORD reason /* Reason this function is being called. */ ,
LPVOID reserved /* Not used. */ )
{
switch (reason)
{
case DLL_PROCESS_ATTACH: /*dll 进程加载的时候执行的事情*/
break;
case DLL_PROCESS_DETACH: /*dll 进程卸载的时候执行的事情*/
break;
case DLL_THREAD_ATTACH: /*dll 线程加载的时候执行的事情*/
break;
case DLL_THREAD_DETACH: /*dll 线程卸载的时候执行的事情*/
break;
}
/* Returns TRUE on success, FALSE on failure */
return TRUE;
}
用 gcc-for-win 3.3.1 编译,获得一个 testdll.dll
然后编写 rundll.c ,源码
[Copy to clipboard]
CODE:#include <stdio.h>
#include <windows.h>
typedef int(*lpAddFun)(int, int); //宏定义函数指针类型
int main(int argc, char *argv[])
{
HINSTANCE hDll; //DLL句柄
lpAddFun addFun; //函数指针
int result;
hDll = LoadLibrary("testdll.dll"); /*加载 testdll.dll*/
if (hDll != NULL)
{
addFun = (lpAddFun)GetProcAddress(hDll, "addxy");
if (addFun != NULL)
{
result = addFun(654, 212); /* 654 + 212*/
printf("%d", result);
}
FreeLibrary(hDll);
}
return 0;
}
#include <windows.h>
typedef int(*lpAddFun)(int, int); //宏定义函数指针类型
int main(int argc, char *argv[])
{
HINSTANCE hDll; //DLL句柄
lpAddFun addFun; //函数指针
int result;
hDll = LoadLibrary("testdll.dll"); /*加载 testdll.dll*/
if (hDll != NULL)
{
addFun = (lpAddFun)GetProcAddress(hDll, "addxy");
if (addFun != NULL)
{
result = addFun(654, 212); /* 654 + 212*/
printf("%d", result);
}
FreeLibrary(hDll);
}
return 0;
}
编译,获得 rundll.exe
把 testdll 放入 rundll.exe 相同工作目录,或者 $PATH 能够到达的地方
然后运行 rundll.exe,可以看到 rundll.exe 装载 testdll.dll,调用里面的 addxy 函数,
QUOTE:
D:/document/studio/c/use_c_dll>rundll
866
D:/document/studio/c/use_c_dll>rundll
866
D:/document/studio/c/use_c_dll>rundll
C++的
先写生成TestDLL.DLL的,这里用了两种方式进行:
保存成TestDLL.cpp然后进行编译。呵呵,因为是用Editplus写的代码,所以要手动编译哦^^
我用的是VS 2005的CL编译接口CL.exe。在Cmd下:CL/c TestDLL.cpp
此时就生成了TestDLL.obj,然后进行链接:link TestDLL.obj /DLL
此时将生成TestDLL.dll,TestDll.exp,TestDll.lib三个文件
工作暂告一个段落。。。。
然后开始写调用TestDLL.dll的CallDLL.exe文件:
保存成CallDLL.cpp文件开始进行编译链接。
这次一步到位:cl CallDll.cpp TestDLL.lib
现在就可以直接运行CallDLL.exe了。。。。
先写生成TestDLL.DLL的,这里用了两种方式进行:
[Copy to clipboard]
CODE:#include <iostream>
using namespace std;
class DLLClass{
public:
// exported member function
__declspec(dllexport) void functionA(void)
{
cout << "In Function A of the exported function" << endl;
return;
}
};
// exported class
class __declspec(dllexport) ExportDLLClass{
public:
void functionB(void)
{
cout << "In Function B of the exported class" << endl;
return;
}
};
// exported instance of the DLLClass
__declspec(dllexport) DLLClass test;
using namespace std;
class DLLClass{
public:
// exported member function
__declspec(dllexport) void functionA(void)
{
cout << "In Function A of the exported function" << endl;
return;
}
};
// exported class
class __declspec(dllexport) ExportDLLClass{
public:
void functionB(void)
{
cout << "In Function B of the exported class" << endl;
return;
}
};
// exported instance of the DLLClass
__declspec(dllexport) DLLClass test;
保存成TestDLL.cpp然后进行编译。呵呵,因为是用Editplus写的代码,所以要手动编译哦^^
我用的是VS 2005的CL编译接口CL.exe。在Cmd下:CL/c TestDLL.cpp
此时就生成了TestDLL.obj,然后进行链接:link TestDLL.obj /DLL
此时将生成TestDLL.dll,TestDll.exp,TestDll.lib三个文件
工作暂告一个段落。。。。
然后开始写调用TestDLL.dll的CallDLL.exe文件:
[Copy to clipboard]
CODE:class DLLClass{
public:
// imported member function
__declspec(dllimport) void functionA(void);
};
// imported class
class __declspec(dllimport) ExportDLLClass{
public:
void functionB(void);
};
// imported instance of the DLLClass
__declspec(dllimport) DLLClass test;
int main(void)
{
ExportDLLClass TestClass;
test.functionA();
TestClass.functionB();
return 0;
}
public:
// imported member function
__declspec(dllimport) void functionA(void);
};
// imported class
class __declspec(dllimport) ExportDLLClass{
public:
void functionB(void);
};
// imported instance of the DLLClass
__declspec(dllimport) DLLClass test;
int main(void)
{
ExportDLLClass TestClass;
test.functionA();
TestClass.functionB();
return 0;
}
保存成CallDLL.cpp文件开始进行编译链接。
这次一步到位:cl CallDll.cpp TestDLL.lib
现在就可以直接运行CallDLL.exe了。。。。
- 用C/C++编写与调用动态链接库(DLL)文件
- 用C/C++编写与调用动态链接库(DLL)文件
- C语言编写DLL动态链接库并分别用VB和Python调用
- Java调用C/C++编写的第三方dll动态链接库
- java调用c/c++编写的第三方dll动态链接库
- JNI技术之Java调用C/C++编写的第三方dll-动态链接库
- Java调用C/C++编写的第三方dll动态链接库
- C#调用C++编写的动态链接库dll文件
- C/C++编写dll动态链接库使用操作与非基本类型参数声明错误
- C#调用C/C++ 动态链接库DLL(一)
- C#调用C/C++ 动态链接库DLL(二)
- C#调用C/C++ 动态链接库DLL(三)
- C#调用C/C++动态链接库(.dll)详解
- C语言调用DLL动态链接库出错
- python 3 调用c/c++ 动态链接库 *.dll
- SAS中调用动态链接库(C++,DLL)
- python中调用动态链接库(C++,DLL)
- C#调用C/C++动态链接库(.dll)详解
- A sunny day
- 想成为嵌入式程序员应知道的0x10个基本问题
- PRB:ASP 返回“Operation Must Use an Updateable Query”(操作必须使用可更新的查询)错误
- Begin to write blog at csdn
- 用ASP.NET 2.0在Oracle中存取图片(文件)的操作
- 用C/C++编写与调用动态链接库(DLL)文件
- JAVA实现贪吃蛇游戏
- Dreamweaver网页制作技巧:使用模板
- 在 ASP.NET 中用匿名委托简单模拟 AOP 做异常和日志处理
- ASP.NET 2.0发送电子邮件中存在的问题
- 使用MD5加密注册用户密码的简单示例
- dreamweaver中网页折叠菜单的制作
- 详细解说iexplore.exe是进程还是病毒
- JSP中基于Session的在线用户统计分析