dll编程

来源:互联网 发布:防范sql注入的常用方法 编辑:程序博客网 时间:2024/06/06 07:29

用vc++6.0新建一个dll工程,选择一个生成字符链接的dll工程:

dll.h

#ifdef DLL_EXPORTS#define DLL_API __declspec(dllexport)#else#define DLL_API __declspec(dllimport)#endif// This class is exported from the dll.dllclass DLL_API CDll {public:CDll(void);};extern DLL_API int nDll;DLL_API int fnDll(void);extern "C" DLL_API int fnTest(int a,int b);

dll.cpp

// dll.cpp : Defines the entry point for the DLL application.//#include "stdafx.h"#include "dll.h"#include <stdio.h>BOOL APIENTRY DllMain( HANDLE hModule,                        DWORD  ul_reason_for_call,                        LPVOID lpReserved ){    switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:case DLL_THREAD_ATTACH:case DLL_THREAD_DETACH:case DLL_PROCESS_DETACH:break;    }    return TRUE;}// This is an example of an exported variableDLL_API int nDll=0;// This is an example of an exported function.DLL_API int fnDll(void){return 42;}DLL_API int fnTest(int a,int b){int c=0;c=a+b;char buffer[10];sprintf(buffer,"%d",c);::MessageBox(NULL,buffer,"dll",MB_OK);return c;}// This is the constructor of a class that has been exported.// see dll.h for the class definitionCDll::CDll(){ return; }

编译生成dll.dll和dll.lib 。把他们和dll.h导入testdll工程目录下

testdll.cpp 分别为静态调用(注释那部分)和动态调用

#include <stdio.h>//#include "dll.h"#include <stdlib.h>#include <windows.h>//#pragma comment(lib,"dll.lib")typedef int (*MyProc) (int,int);int main(){int result=0;int i=0;scanf("%d",&i);MyProc fp;HINSTANCE hdll=LoadLibrary("dll.dll");if(hdll==NULL){::MessageBox(NULL,"找不到dll","tips",MB_OK);return -1;}//result=fnTest(5,i);fp=(MyProc)GetProcAddress(hdll,"fnTest");result=fp(5,i);printf("the dll's Return is %d!\n",result);system("pause");return 0;}