你是不是覺得你寫的控制檯程序的字太單調了,你是不是有時候需提醒用戶注意你的某行輸出。呵呵感覺這兩句像廣告,好了言歸正傳,這兩天寫了一個可以打印紅綠藍三種顏色的printf函數並做成了動態連接庫。代碼說明一切。
head file code :
#ifndef DllDemo_EXPORTS
#define DllAPI __declspec(dllexport)
//#else
//這個兩句將在隱式的使用dll的時候導致不能連接
//#define DllAPI __declspec(dllimport)
extern "C" //原樣編譯
{
DllAPI int __stdcall ErrPrintf(TCHAR *format, ...) ; //__stdcall使非C/C++語言內能夠調用API
DllAPI int __stdcall GreenPrintf(TCHAR *format, ...) ;
DllAPI int __stdcall BluePrintf(TCHAR *format, ...) ;
DllAPI int __stdcall RedPrintf(TCHAR *format, ...);
}
#endif
CPP file code:
// PrintfColorDll.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include "PrintfColorDll.h"
#include "stdafx.h"
#include "stdio.h"
#include "tchar.h"
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
//錯誤
DllAPI int __stdcall ErrPrintf(TCHAR *format, ...)
{
HANDLE hStdout = NULL ;
TCHAR szBuffer[1024] ;
va_list arg_list ;
int nBuf = 0 ;
va_start(arg_list,format);
nBuf = _vsntprintf(szBuffer,1024,format,arg_list) ;
va_end(arg_list) ;
//get console ouput handle
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
if(!hStdout)
{
return 0;
}
//set red colour
if (! SetConsoleTextAttribute(hStdout, FOREGROUND_RED | FOREGROUND_INTENSITY))
{
return 0;
}
//print
nBuf = _tprintf(_T("%s"),szBuffer) ;
//restore to white.
if (! SetConsoleTextAttribute(hStdout, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN))
{
return 0;
}
return nBuf ;
}
//紅色
DllAPI int __stdcall RedPrintf(TCHAR *format, ...)
{
HANDLE hStdout = NULL ;
TCHAR szBuffer[1024] ;
va_list arg_list ;
int nBuf = 0 ;
va_start(arg_list,format);
nBuf = _vsntprintf(szBuffer,1024,format,arg_list) ;
va_end(arg_list) ;
//get console ouput handle
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
if(!hStdout) {
return 0;
}
//set red colour
if (! SetConsoleTextAttribute(hStdout, FOREGROUND_RED |
FOREGROUND_INTENSITY)) {
return 0;
}
//print
nBuf = _tprintf(_T("%s"),szBuffer) ;
//restore to white.
if (! SetConsoleTextAttribute(hStdout, FOREGROUND_RED |
FOREGROUND_BLUE |
FOREGROUND_GREEN)) {
return 0;
}
return nBuf ;
}
//綠色
DllAPI int __stdcall GreenPrintf(TCHAR *format, ...)
{
HANDLE hStdout = NULL ;
TCHAR szBuffer[1024] ;
va_list arg_list ;
int nBuf = 0 ;
va_start(arg_list,format);
nBuf = _vsntprintf(szBuffer,1024,format,arg_list) ;
va_end(arg_list) ;
//get console ouput handle
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
if(!hStdout) {
return 0;
}
//set Green colour
if (! SetConsoleTextAttribute(hStdout, FOREGROUND_GREEN |
FOREGROUND_INTENSITY)) {
return 0;
}
//print
nBuf = _tprintf(_T("%s"),szBuffer) ;
//restore to white.
if (! SetConsoleTextAttribute(hStdout, FOREGROUND_RED |
FOREGROUND_BLUE |
FOREGROUND_GREEN)) {
return 0;
}
return nBuf ;
}
//藍色
DllAPI int __stdcall BluePrintf(TCHAR *format, ...)
{
HANDLE hStdout = NULL ;
TCHAR szBuffer[1024] ;
va_list arg_list ;
int nBuf = 0 ;
va_start(arg_list,format);
nBuf = _vsntprintf(szBuffer,1024,format,arg_list) ;
va_end(arg_list) ;
//get console ouput handle
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
if(!hStdout) {
return 0;
}
//set Blue colour
if (! SetConsoleTextAttribute(hStdout, FOREGROUND_BLUE |
FOREGROUND_INTENSITY)) {
return 0;
}
//print
nBuf = _tprintf(_T("%s"),szBuffer) ;
//restore to white.
if (! SetConsoleTextAttribute(hStdout, FOREGROUND_RED |
FOREGROUND_BLUE |
FOREGROUND_GREEN)) {
return 0;
}
return nBuf ;
}
example code:
#include "stdio.h"
#include <tchar.h>
#pragma comment(lib,"PrintfColorDll.lib") //在編輯器link時,鏈接到.lib文件
extern "C"
{
__declspec(dllimport) int __stdcall ErrPrintf(TCHAR *format,...);
__declspec(dllimport) int RedPrintf(TCHAR *format,...);
__declspec(dllimport) int GreenPrintf(TCHAR *format,...);
__declspec(dllimport) int BluePrintf(TCHAR *format,...);
}
//#include "iostream"
//using namespace std;
int main()
{
int inta=1;
float floata=5.0f;
char chara='a';
ErrPrintf("this is error test!/n");
GreenPrintf("this is a green test!/n");
BluePrintf("this is a blue test!/n");
RedPrintf("this is a red test!/n");
//GreenPrintf("%d, %f, %c",inta,floata,chara);
GreenPrintf("%d/t%c/n",inta,chara);
// GreenPrintf("%f",floata); //function can not work when printing float type?
printf("%f",floata);
//_tprintf("%f",1.0);
getchar();
return 0;
}
做成動態連接庫後不能打印浮點型數據了不知道why,哪位大俠知道留個言不勝感激!
編譯環境:WinXP sp2 VC++6.0 sp6