用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.dll class 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 : 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 variable DLL_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 definition CDll::CDll() { return; }
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; }