在vs2008测试第一个动态链接库的项目,很久以前就对动态链接库感兴趣,因为他可以让可执行程序变的小一点,减轻程序的负担。
.h的代码
#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
DLL中供应的应用程序所用的函数必须先导出,须让主程序知道这些函数都来自DLL。
.c的代码
#include <windows.h> #include "Edrlib.h" BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved ) { 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); }
Petzold强烈建议dll中的函数都准备两个版本:ANSI和UNICODE版本,这也很有道理,但是我不是很清楚,ANSI版本的东西还是否还很实用?
这次又有新的收获,GetTextExtentPoint,通过这函数跟字符输出函数配合达到很好的自动换行显示效果。