如何實現(xiàn)繁簡體互換?
// j2f.cpp : 簡體(gb)==>繁體==>big5的過程
// 反向轉(zhuǎn)換是類似的.
// 注意直接從簡體-->big5不能做到一一對應(yīng).會有很多?出現(xiàn),
// 故此需要先轉(zhuǎn)成繁體.再轉(zhuǎn)成big5.
// 我感覺這種方法應(yīng)當(dāng)和winnt或office里提供的繁簡或字符集互轉(zhuǎn)是一致的.
#include "stdafx.h"
#include
#include
#include
#include
#include
using namespace std;
void j2f(const string &s)
{
int n=s.length ();
int r=LCMapString(
MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC),
LCMAP_TRADITIONAL_CHINESE,
s.c_str (),s.length (),NULL,0);
if (!r) cout <<"error :"<
char *ft=new char[r+1];
r=LCMapString(
MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC),
LCMAP_TRADITIONAL_CHINESE,
s.c_str (),s.length (),ft,r+1);//這個api搞掂簡體轉(zhuǎn)繁體,下面會打印繁體出來
if (r) {
ft[r]=0;
cout<
wchar_t *pws=new wchar_t[r+1];
int r1=MultiByteToWideChar(936,0,ft,r,pws,r+1);
BOOL f=FALSE;
r1=WideCharToMultiByte(950,0,pws,r1,ft,r+1,"?",&f);//代碼頁切換搞掂gb->big5
ft[r1]=0;
cout<<<"(";
for (int i=0;i cout<<"";
printf("0x%02x ",(BYTE)ft[i]);
}
cout<<")"<
delete [] pws;
}
delete []ft;
}
//從標(biāo)準(zhǔn)輸入簡體國標(biāo)-->big5繁體標(biāo)準(zhǔn)輸出,輸入兩個空行退出
int main(int argc, char* argv[])
{
for(;;){
char line[1024];
cin.getline (line,sizeof(line));
string s(line);
if (!cin ||s.length ()==0) break;
j2f(s);
}
_getch();
return 0;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1.首先請參閱其他技術(shù)專欄中用VB6.0訪問注冊表,創(chuàng)建
HKEY_LOCAL_MACHINE,\SYSTEM\CurrentControlSet\Services\Eventlog\Eventlog2\Eventlog2鍵,并且寫入EventMessageFile,value為C:\WINNT\Microsoft.NET\Framework\v1.1.4322\EventLogMessages.dll
2.在C#.net使用以下代碼寫日志
//輸出日志的CLASS
using System;
using System.Diagnostics;
using System.Text;
namespace CorePlus.Framework.Utility
{
?/// <summary>
?/// 寫日志的CLASS
?/// </summary>
?public class LogUtility
?{
? public enum EVENT
? {
?? /// <summary>重大錯誤</summary>
?? EVENT_ERROR,
?? /// <summary>操作失敗</summary>
?? EVENT_FAILUREAUDIT,
?? /// <summary>一般信息</summary>
?? EVENT_INFORMATION,
?? /// <summary>有效的,成功的操作</summary>
?? EVENT_SUCCESSAUDIT,
?? /// <summary>警告</summary>
?? EVENT_WARNING,
? }
? private static TextWriterTraceListener listner = null;
? /// <summary>
? /// 構(gòu)造函數(shù)
? /// </summary>
? public LogUtility () {}
? /// <param name="loginID">登錄ID</param>
? /// <param name="screenID">畫面ID</param>
? /// <param name="level">警告級別</param>
? /// <param name="message">日志信息</param>
? public static void Logging (
?? string loginID,
?? string screenID,
?? EVENT level,
?? string message )
? {
?? // 變量定義
?? StringBuilder? outputMessage = null; // 輸出的信息
?? string??? targetLevelString = null;
?? EventLogEntryType Eventtype = new EventLogEntryType();
?? switch (level)
?? {
??? case EVENT.EVENT_ERROR:
???? Eventtype = EventLogEntryType.Error;
???? break;
??? case EVENT.EVENT_FAILUREAUDIT:
???? Eventtype = EventLogEntryType.FailureAudit;
???? break;
??? case EVENT.EVENT_INFORMATION:
???? Eventtype = EventLogEntryType.Information;
???? break;
??? case EVENT.EVENT_SUCCESSAUDIT:
???? Eventtype = EventLogEntryType.SuccessAudit;
???? break;
??? case EVENT.EVENT_WARNING:
???? Eventtype = EventLogEntryType.Warning;
???? break;
?? }
?? // 日志信息的拼合
?? outputMessage = MakeMessage( loginID, screenID, targetLevelString, message );
?? // 寫日志
?? Logging( Eventtype, outputMessage.ToString() );
? }
? /// <summary>
? /// 向日志管理器寫日志
? /// </summary>
? /// <param name="level">錯誤級別</param>
? /// <param name="message">輸出的信息</param>
? private static void Logging ( EventLogEntryType level, string message )
? {
?? // 變量定義
?? string? logName? = null; // 日志名
?? string? machineName = null; // 機器名
?? string? sourceName = null; // SourceName
?? EventLog eventLog = null; // EventLog
?? logName? = "Eventlog2";? // 日志名
?? machineName = "."; // 機器名
?? sourceName = "Eventlog2"; // SourceName
?? eventLog = new EventLog( logName, machineName, sourceName );
?? eventLog.WriteEntry( message,level );
?? eventLog = null;
? }
? /// <summary>
? /// 日志最終拼合
? /// </summary>
? /// <param name="loginID">登錄ID</param>
? /// <param name="screenID">畫面ID</param>
? /// <param name="levelString">錯誤級別</param>
? /// <param name="message">日志信息</param>
? /// <returns>輸出的日志信息</returns>
? private static StringBuilder MakeMessage (
?? string loginID,
?? string screenID,
?? string levelString,
?? string message )
? {
?? // 變量定義
?? StringBuilder retMessage = new StringBuilder();
?? retMessage.Append( "【登錄ID】" );
?? retMessage.Append( loginID );
?? retMessage.Append( "\n【畫面ID】" );
?? retMessage.Append( screenID );
?? retMessage.Append( "\n【錯誤級別】" );
?? retMessage.Append( levelString );
?? retMessage.Append( "\n【錯誤信息】\n" );
?? retMessage.Append( message );
?? return retMessage;
??? }
? }
}
// 在FORM中輸出日志
? private void button1_Click(object sender, System.EventArgs e)
? {
?? LogUtility.Logging( "bbbbbb","22222222",LogUtility.EVENT.EVENT_ERROR,"3333333" );
? }
運行完程序后打開日志管理器看看~~~~~~~~~怎么樣?不錯吧,呵呵.
?
?
?
////////////////////////////////////////////////////////////////////////////
1.窗口信息
MS為我們提供了打開特定桌面和枚舉桌面窗口的函數(shù)。
hDesk=OpenDesktop(lpszDesktop,0,FALSE,DESKTOP_ENUMERATE);
//打開我們默認(rèn)的Default桌面;
EnumDesktopWindows(hDesk,(WNDENUMPROC)EnumWindowProc,0);
//枚舉打開桌面上的所有窗口,由回調(diào)函數(shù)實現(xiàn)。
BOOL __stdcall EnumWindowProc(HWND, LPARAM);
//在回調(diào)函數(shù)中,我們可以獲得窗口的標(biāo)題和相關(guān)進程,線程信息;
GetWindowText(hWnd,szWindowText,dwMaxCount);
GetWindowThreadProcessId(hWnd,&dwPID);
2.設(shè)備驅(qū)動器信息(服務(wù)和設(shè)備驅(qū)動器差不多,在此不做重復(fù))
設(shè)備驅(qū)動信息有服務(wù)控制管理器(SCM)來管理的,我要打開服務(wù)控制管理器,并枚舉所有的設(shè)備驅(qū)動器。
OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
//以所有權(quán)限打開服務(wù)控制管理器;
EnumServicesStatus(schManager,dwDeviceType,dwDeviceState,
EnumStatus,dwBufSize,&dwBytesNeeded,
&dwDevicesReturned,&dwResumeHandle))
//枚舉所有設(shè)備的當(dāng)前狀態(tài);
CloseServiceHandle(schManager);
//記住,在結(jié)束訪問后要關(guān)閉服務(wù)句柄;
OpenService(schManager,szDeviceName,SERVICE_ALL_ACCESS);
//打開特定的設(shè)備驅(qū)動器;
QueryServiceConfig(schDevice,lpDeviceConfig,
?? 1024*8,&dwBytesNeeded);
//查詢驅(qū)動器的服務(wù)配置信息;
QueryServiceStatus(schDevice,&DeviceStatus);
//查詢設(shè)備驅(qū)動器的當(dāng)前狀態(tài);
QueryServiceConfig2(schDevice,SERVICE_CONFIG_DESCRIPTION,
?。↙PBYTE)lpDeviceDescription,8*1024,&dwBytesNeeded)
//查詢設(shè)備的描述信息;
StartService(schDevice,0,NULL);
//啟動設(shè)備;
ControlService(schDevice,SERVICE_CONTROL_STOP,&DeviceStatus);
//停止設(shè)備;
DeleteService(schDevice);
//刪除設(shè)備;
3.磁盤信息
我們希望獲得系統(tǒng)所有磁盤的信息,包括軟盤,硬盤,光盤等等;
GetLogicalDriveStrings(dwBufferLength,lpBuffer);
//獲得邏輯設(shè)備的信息;
GetVolumeInformation(lpRootPathName,lpVolumeNameBuffer,
dwVolumeNameSize,&dwVolumeSerialNumber,
&dwMaximumComponentLength,&dwFileSystemFlags,
lpFileSystemNameBuffer,dwFileSystemNameSize);
//獲得磁盤卷信息,包括卷名稱和格式類型;
GetDiskFreeSpaceEx(lpRootPathName,&FreeBytesAvailable,
? &TotalNumberOfBytes,&TotalNumberOfFreeBytes);
//探測磁盤的空間使用情況;
4.環(huán)境變量
我們可以從注冊表中獲得環(huán)境塊的信息:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment,當(dāng)然要使用注冊表的函數(shù)。
RegOpenKeyEx(HKEY_LOCAL_MACHINE,RegKey,0,KEY_QUERY_VALUE,&hKey);
//打開注冊表的鍵;
RegEnumValue(hKey,dwIndex,EnvironVariable,
&dwVariableLength,NULL,NULL,NULL,NULL);
//查詢我們需要的信息值;
GetEnvironmentVariable(EnvironVariable,EnvironString,1024);
//獲得環(huán)境變量的字符串信息;
?
?
5.事件記錄信息
OpenEventLog(NULL,szLog);
//打開時間日志記錄;
GetOldestEventLogRecord(hEvent,&dwThisRecord);
//獲得最新的日志信息,以便繼續(xù)查找;
ReadEventLog(hEvent,EVENTLOG_FORWARDS_READ │ EVENTLOG_SEQUENTIAL_READ,
?? 0,pEventLogRecord,1024*32,&dwRead,&dwNeeded)
//讀去日志信息;
LookupAccountSid(NULL,pSid,szName,&dwName,szDomain,&dwDomain,&SNU);
//獲取賬戶的SID,以便獲得賬戶的用戶名稱;
GetNumberOfEventLogRecords(hEvent,&dwTotal);
//獲得事件日志的總數(shù);
CloseEventLog(hEvent);
//不要忘記關(guān)閉事件句柄;
6.網(wǎng)絡(luò)共享
我們使用第二等級的網(wǎng)絡(luò)共享搜索;
NetShareEnum(NULL,dwLevel,(PBYTE *)&pBuf,MAX_PREFERRED_LENGTH,&entriesread,&totalentries,&resume);
//列舉所有的共享目錄及相關(guān)信息;
NetApiBufferFree(pBuf);
//釋放緩沖區(qū);
NetShareDel(NULL,(char *)lpShareNameW,0);
//刪除網(wǎng)絡(luò)共享目錄;
7.網(wǎng)絡(luò)適配器信息
我們要探測NIC的信息和網(wǎng)絡(luò)流量;
GetAdaptersInfo(&AdapterInfo,&OutBufLen);
//獲取適配器信息;
8.系統(tǒng)性能
獲取系統(tǒng)的存儲器使用情況;
GetPerformanceInfo(&PerfInfo,sizeof(PERFORMACE_INFORMATION))
//獲取系統(tǒng)性能信息;
9.進程/線程/模塊信息
在此我們使用工具幫助函數(shù)(ToolHelp32)和系統(tǒng)
OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY │ TOKEN_ADJUST_PRIVILEGES,&hToken);
//打開進程的令牌,提升權(quán)限;
AdjustTokenPrivileges(hToken,FALSE,&TokenPrivileges,sizeof(TOKEN_PRIVILEGES),NULL,NULL);
//將進程的權(quán)限提升到支持調(diào)試(Debug);
CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
//創(chuàng)建進程的快照;
Process32First(hProcessSnap,&ProcessEntry32);
Process32First(hProcessSnap,&ProcessEntry32);
//枚舉所有進程;
OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,ProcessEntry32.th32ProcessID);
//打開特定進程,以查詢進程相關(guān)信息;
GetProcessTimes(hProcess,&CreateTime,&ExitTime,&KernelTime,&UserTime);
//獲取進程的時間信息;
GetProcessMemoryInfo(hProcess,&PMCounter,sizeof(PMCounter));
//獲取進程的存儲區(qū)信息;
GetPriorityClass(hProcess);
//獲取進程的優(yōu)先權(quán);
GetProcessIoCounters(hProcess,&IoCounters);
//獲取進程的IO使用情況;
CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessID);
//創(chuàng)建模塊快照;
Module32First(hModuleSnap, &ModuleEntry32);
Module32Next(hModuleSnap, &ModuleEntry32);
//枚舉進程模塊信息;
CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
//創(chuàng)建線程快照;
Thread32First(hThreadSnap, &ThreadEntry32);
Thread32Next(hThreadSnap, &ThreadEntry32);
//枚舉線程信息;
OpenThread(THREAD_ALL_ACCESS,FALSE,ThreadEntry32.th32ThreadID);
//打開線程,須自己獲得此函數(shù)地址;
TerminateProcess(hProcess,0);
//終止進程;
SuspendThread(hThread);
//懸掛線程;
ResumeThread(hThread);
//激活線程;
?
?
10.關(guān)機
AdjustTokenPrivileges(hToken,FALSE,&TokenPrivileges,sizeof(TOKEN_PRIVILEGES),NULL,NULL);
//調(diào)整進程令牌,使其支持關(guān)機;
ExitWindowsEx(EWX_LOGOFF,0);
//注銷系統(tǒng);
LockWorkStation();
//鎖定系統(tǒng);
InitiateSystemShutdown(NULL,szMessage,dwTimeout,FALSE,bSig);
//支持到記時和消息顯示的關(guān)機/重啟;
SetSystemPowerState(bSig,FALSE);
//系統(tǒng)休眠/冬眠;
11.用戶信息
NetUserEnum(NULL,dwLevel,FILTER_NORMAL_ACCOUNT,(LPBYTE*)&pBuf, dwPrefMaxLen,&dwEntriesRead,&dwTotalEntries,&dwResumeHandle);
//枚舉系統(tǒng)用戶信息;
NetUserDel(NULL,lpUserNameW);
//刪除指定用戶;
?
12.系統(tǒng)版本信息
GetVersionEx((LPOSVERSIONINFO)&osviex);
//獲取操作系統(tǒng)的版本信息;
我們也可以通過注冊表(HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion)獲取相關(guān)信息:
GetTickCount();
//獲取開機時間;
GetComputerName(szInfo,&dwInfo);
//獲取計算機名稱;
GetUserName(szInfo,&dwInfo);
//獲取計算機用戶名;
GetWindowsDirectory(szInfo,MAX_PATH+1);
//獲取Windows目錄;
GetSystemDirectory(szInfo,MAX_PATH+1);
//獲取系統(tǒng)目錄;
/////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
事件記錄信息
OpenEventLog(NULL,szLog);
//打開時間日志記錄;
GetOldestEventLogRecord(hEvent,&dwThisRecord);
//獲得最新的日志信息,以便繼續(xù)查找;
ReadEventLog(hEvent,EVENTLOG_FORWARDS_READ │ EVENTLOG_SEQUENTIAL_READ,
?? 0,pEventLogRecord,1024*32,&dwRead,&dwNeeded)
//讀去日志信息;
LookupAccountSid(NULL,pSid,szName,&dwName,szDomain,&dwDomain,&SNU);
//獲取賬戶的SID,以便獲得賬戶的用戶名稱;
GetNumberOfEventLogRecords(hEvent,&dwTotal);
//獲得事件日志的總數(shù);
CloseEventLog(hEvent);
//不要忘記關(guān)閉事件句柄;