1 先建一个WORKSPACE 叫 DERTEST
2. 建一个project 叫DERLIB,这个project位于DERTEST WORKSPACE 下
先编写DLL
3. 再建立一个porject叫DERTEST (唉,前面的 WORKSPACE真不应该取名为DERTEST,容易搞混),
同样这个project也必须选择位于DEREST WORKSPACE下
1. DLL的源文件 EDRLIB.C和EDRLIB.H
//EDRLIB.C /*------------------------------------------------- EDRLIB.C -- Easy Drawing Routine Library module (c) Charles Petzold, 1998 -------------------------------------------------*/ #include <windows.h> #include "edrlib.h" //pvReserved 系统保留参数 //fdwReason: 用来说明调用DLLMain的原因: //(1)比如DLL_PROCESS_ATTACH 表示DLL已经映射到一个进程的地址空间,也是初始化DLL(分配空间等) // DLLMain返回非零值则初始化成功,否则 // (2)当 fdwReason的值是DLL_PROCESS_ATTACH,那么调用者(进程)不在需要该DLL,该DLL可以自行clean up //当fdwReason的值是DLL_THREAD_ATTACH, it means that an attached process has created a new thread. //When the thread terminates, Windows calls DllMain with an fdwReason parameter of DLL_THREAD_DETACH //(3) DllMain is called with a parameter of DLL_THREAD_DETACH int WINAPI DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved) { return TRUE ; } EXPORT BOOL CALLBACK EdrCenterTextA (HDC hdc, PRECT prc, PCSTR pString) { int iLength ; SIZE size ; iLength = lstrlenA (pString) ; GetTextExtentPoint32A (hdc, pString, iLength, &size) ; return TextOutA (hdc, (prc->right - prc->left - size.cx) / 2, (prc->bottom - prc->top - size.cy) / 2, pString, iLength) ; } EXPORT BOOL CALLBACK EdrCenterTextW (HDC hdc, PRECT prc, PCWSTR pString) { int iLength ; SIZE size ; iLength = lstrlenW (pString) ; GetTextExtentPoint32W (hdc, pString, iLength, &size) ; return TextOutW (hdc, (prc->right - prc->left - size.cx) / 2, (prc->bottom - prc->top - size.cy) / 2, pString, iLength) ; }
// 头文件对DLL的导出函数申明
//EDRLIB.H /*---------------------- EDRLIB.H header file ----------------------*/ #ifdef __cplusplus #define EXPORT extern "C" __declspec (dllexport) #else #define EXPORT __declspec (dllexport) #endif EXPORT BOOL CALLBACK EdrCenterTextA (HDC, PRECT, PCSTR) ; EXPORT BOOL CALLBACK EdrCenterTextW (HDC, PRECT, PCWSTR) ; #ifdef UNICODE #define EdrCenterText EdrCenterTextW #else #define EdrCenterText EdrCenterTextA #endif
//--- 测试文件 EDRTEST.C
//EDRTEST.C /*-------------------------------------------------------- EDRTEST.C -- Program using EDRLIB dynamic-link library (c) Charles Petzold, 1998 --------------------------------------------------------*/ #include <windows.h> #include "edrlib.h" LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("StrProg") ; HWND hwnd ; MSG msg ; WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = szAppName ; if (!RegisterClass (&wndclass)) { MessageBox (NULL, TEXT ("This program requires Windows NT!"), szAppName, MB_ICONERROR) ; return 0 ; } hwnd = CreateWindow (szAppName, TEXT ("DLL Demonstration Program"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL) ; ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ; while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } return msg.wParam ; } LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc ; PAINTSTRUCT ps ; RECT rect ; switch (message) { case WM_PAINT: hdc = BeginPaint (hwnd, &ps) ; GetClientRect (hwnd, &rect) ; EdrCenterText (hdc, &rect, TEXT ("This string was displayed by a DLL")) ; EndPaint (hwnd, &ps) ; return 0 ; case WM_DESTROY: PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; }