c语言如何生成DLL文件
{ switch (reason) { case DLL_PROCESS_ATTACH: break; case DLL_PROCESS_DETACH: break;
case DLL_THREAD_ATTACH: break;
case DLL_THREAD_DETACH: break; }
/* Returns TRUE on success, FALSE on failure */ return TRUE; }
还有要注意的在.def 文件中指定输出的函数,编译生成了 hello.dll 文件
DLL 调用部分 dllcall.c #include <windows.h> #include <stdio.h> #include <stdlib.h>
HINSTANCE hDLL; //定义 DLL 包柄 typedef void ( *func)(); //定义函数指针原型 func hello; //定义函数指针 int main() {
BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ ,
DWORD reason
/* Reason this function is being called. */ ,
LPVOID reserved /* Not used. */ )来自/*过程要带入的参数*/
LibHandle = LoadLibrary(dllbuf); /*载入 dll*/
FUNCADD = (MYFUNC)GetProcAddress(
LibHandle, sysbuf); /*获取函数 sysbuf 的地址*/
(FUNCADD) (NULL,downfile,savefile,0,NULL);
开发环境是 DEV C++,采用 C 语言编写 创建一个 DLL 项目,项目名称 hello,DLL 编写采用的是 DEV C++中的示例代码
头文件 dll.h #ifndef _DLL_H_ #define _DLL_H_
#if BUILDING_DLL # define DLLIMPORT __declspec (dllexport) #else /* Not BUILDING_DLL */ # define DLLIMPORT __declspec (dllimport) #endif /* Not BUILDING_DLL */
if (hDLL == NULL) hDLL=LoadLibrary("hello.dll"); //加载 DLL
hello = (func)GetProcAddress(hDLL,"HelloWorld"); //获取函数指针 hello(); FreeLibrary(hDLL); //释放 DLL return 0; }
/*FUNCADD 就 相 当 于 函 数
URLDownloadToFileA 后面是参数*/
}
#include <WINDOWS.H> #include <WINBASE.H> typedef int (*MYFUNC)(PVOID,char*,char*,int,char*); /* 函数原型*/ int main() {
HINSTANCE LibHandle; MYFUNC FUNCADD; char dllbuf[] = "UrlMon.dll"; char sysbuf[] = "URLDownloadToFileA"; /*函数名*/ char *downfile = "/img/logo-yy.gif"; char *savefile = "f:\\c\\.gif";编译执行
/*c 语言调用 dll 里的函数-例子 2 之文件下载 都 5 点了,还是睡不着,躺在床上 想着该做点撒,于是乎,开始查找了下资料,大致弄清楚了 c 里怎么调用 dll 里的函数,就写了个文件下载的例子,很简单,调用系统本身的 UrlMon.dll 里的 URLDownloadToFileA 函数,之前的例子一是过程的调用,现在这个是 函数的调用,都很简单。*/
DLLIMPORT void HelloWorld (void);
#endif /* _DLL_H_ */
C 文件 dllmain.c #include <stdio.h> #include <stdlib.h>
DLLIMPORT void HelloWorld () {
MessageBox (0, "Hello World from DLL!\n", "Hi", MB_ICONINFORMATION); }