在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,通过这函数跟字符输出函数配合达到很好的自动换行显示效果。