编程技巧搜集(2)

1.ComboBox中如何进行 动态查询(BCB)
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include <assert.h>       //++++++++
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//===========================================================================
//功能:检测Value 是否在Lp..Hp之间
bool __fastcall In(int Lp, int Hp,int Value)
{
        assert(Lp<=Hp);
        return ((Value<=Hp)&&(Value>=Lp));
}
//参数:一个汉字
//返回值:该汉字的拼音
char __fastcall GetPYChar(AnsiString HZ)
{
assert(HZ.Length()==2);
WORD Hi=WORD(HZ[1])<<8;
WORD Lo=BYTE(HZ[2]);
int n=Hi+Lo;
if (In(0xB0A1,0xB0C4,n)) return 'A';
if (In(0XB0C5,0XB2C0,n)) return 'B';
if (In(0xB2C1,0xB4ED,n)) return 'C';
if (In(0xB4EE,0xB6E9,n)) return 'D';
if (In(0xB6EA,0xB7A1,n)) return 'E';
if (In(0xB7A2,0xB8c0,n)) return 'F';
if (In(0xB8C1,0xB9FD,n)) return 'G';
if (In(0xB9FE,0xBBF6,n)) return 'H';
if (In(0xBBF7,0xBFA5,n)) return 'J';
if (In(0xBFA6,0xC0AB,n)) return 'K';
if (In(0xC0AC,0xC2E7,n)) return 'L';
if (In(0xC2E8,0xC4C2,n)) return 'M';
if (In(0xC4C3,0xC5B5,n)) return 'N';
if (In(0xC5B6,0xC5BD,n)) return 'O';
if (In(0xC5BE,0xC6D9,n)) return 'P';
if (In(0xC6DA,0xC8BA,n)) return 'Q';
if (In(0xC8BB,0xC8F5,n)) return 'R';
if (In(0xC8F6,0xCBF0,n)) return 'S';
if (In(0xCBFA,0xCDD9,n)) return 'T';
if (In(0xCDDA,0xCEF3,n)) return 'W';
if (In(0xCEF4,0xD188,n)) return 'X';
if (In(0xD1B9,0xD4D0,n)) return 'Y';
if (In(0xD4D1,0xD7F9,n)) return 'Z';
return char(0);
}
//===========================================================================
void __fastcall TForm1::ComboBox1KeyPress(TObject *Sender, char &Key)
{
  char c;
  for(int i=0;i<ComboBox1->Items->Count;i++){
    c= GetPYChar(ComboBox1->Items->Strings[i].SubString(0,2));
    if(toupper(c)==toupper(Key)){
      Key=NULL;
      ComboBox1->ItemIndex=i;break;
      }
    }

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  ComboBox1->Items->Clear();
  ComboBox1->Text="";
  ComboBox1->Items->Add("长沙");
  ComboBox1->Items->Add("北京");
  ComboBox1->Items->Add("武汉");
  ComboBox1->Items->Add("桂林");
}

2.实现重起删除文件
ForceKiller软件中,这样描述到"此方式不是直接删除文件,因此文件不会立即被删除而是通知系统核心SMSS在下次开机时由核心自动删除!"
实现:
MoveFileEx(szDstFile, NULL, MOVEFILE_DELAY_UNTIL_REBOOT);
它是写入注册表,等到启动时.smss从注册表读出然后删除,之后smss才引导win32子系统.

3.如何把一个程序加入windows防火墙的白名单

// WindowsFirewall.h: interface for the CWindowsFirewall class.
//
//

#if !defined(AFX_WINDOWSFIREWALL_H__9F175C70_A4B7_4ECF_9A01_5B72FBE9C5C0__INCLUDED_)
#define AFX_WINDOWSFIREWALL_H__9F175C70_A4B7_4ECF_9A01_5B72FBE9C5C0__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <netfw.h>

//windows防火墙查询控制类。
class CWindowsFirewall 
{
public:
CWindowsFirewall();
virtual ~CWindowsFirewall();
HRESULT Initialize(OUT INetFwProfile** fwProfile);
void Cleanup(IN INetFwProfile* fwProfile);
HRESULT IsOn(IN INetFwProfile* fwProfile, OUT BOOL* fwOn);
HRESULT TurnOn(IN INetFwProfile* fwProfile);
HRESULT TurnOff(IN INetFwProfile* fwProfile);
HRESULT AppIsEnabled(
IN INetFwProfile* fwProfile,
IN const wchar_t* fwProcessImageFileName,
OUT BOOL* fwAppEnabled
);
HRESULT AddApp(
IN INetFwProfile* fwProfile,
IN const wchar_t* fwProcessImageFileName,
IN const wchar_t* fwName
);
HRESULT PortIsEnabled(
IN INetFwProfile* fwProfile,
IN LONG portNumber,
IN NET_FW_IP_PROTOCOL ipProtocol,
OUT BOOL* fwPortEnabled
);

HRESULT PortAdd(
IN INetFwProfile* fwProfile,
IN LONG portNumber,
IN NET_FW_IP_PROTOCOL ipProtocol,
IN const wchar_t* name
);

int Test();

};
#endif // !defined(AFX_WINDOWSFIREWALL_H__9F175C70_A4B7_4ECF_9A01_5B72FBE9C5C0__INCLUDED_)



// CWindowsFirewall::.cpp: implementation of the CCWindowsFirewall:: class.
//
//

#include "stdafx.h"
#include <objbase.h>
#include "WindowsFirewall.h"
//#include <windows.h>
#include <crtdbg.h>


#include <objbase.h>
#include <oleauto.h>
#include <stdio.h>
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//
// Construction/Destruction
//

CWindowsFirewall::CWindowsFirewall()
{

}

CWindowsFirewall::~CWindowsFirewall()
{

}
/*
    Copyright (c) Microsoft Corporation

    SYNOPSIS

        Sample code for the Windows Firewall COM interface.
*/

 

HRESULT CWindowsFirewall::Initialize(OUT INetFwProfile** fwProfile)
{
    HRESULT hr = S_OK;
    INetFwMgr* fwMgr = NULL;
    INetFwPolicy* fwPolicy = NULL;

    _ASSERT(fwProfile != NULL);

    *fwProfile = NULL;

    // Create an instance of the firewall settings manager.
    hr = CoCreateInstance(
            __uuidof(NetFwMgr),
            NULL,
            CLSCTX_INPROC_SERVER,
            __uuidof(INetFwMgr),
            (void**)&fwMgr
            );
    if (FAILED(hr))
    {
        printf("CoCreateInstance failed: 0x%08lx/n", hr);
        goto error;
    }

    // Retrieve the local firewall policy.
    hr = fwMgr->get_LocalPolicy(&fwPolicy);
    if (FAILED(hr))
    {
        printf("get_LocalPolicy failed: 0x%08lx/n", hr);
        goto error;
    }

    // Retrieve the firewall profile currently in effect.
    hr = fwPolicy->get_CurrentProfile(fwProfile);
    if (FAILED(hr))
    {
        printf("get_CurrentProfile failed: 0x%08lx/n", hr);
        goto error;
    }

error:

    // Release the local firewall policy.
    if (fwPolicy != NULL)
    {
        fwPolicy->Release();
    }

    // Release the firewall settings manager.
    if (fwMgr != NULL)
    {
        fwMgr->Release();
    }

    return hr;
}


void CWindowsFirewall::Cleanup(IN INetFwProfile* fwProfile)
{
    // Release the firewall profile.
    if (fwProfile != NULL)
    {
        fwProfile->Release();
    }
}


HRESULT CWindowsFirewall::IsOn(IN INetFwProfile* fwProfile, OUT BOOL* fwOn)
{
    HRESULT hr = S_OK;
    VARIANT_BOOL fwEnabled;

    _ASSERT(fwProfile != NULL);
    _ASSERT(fwOn != NULL);

    *fwOn = FALSE;

    // Get the current state of the firewall.
    hr = fwProfile->get_FirewallEnabled(&fwEnabled);
    if (FAILED(hr))
    {
        printf("get_FirewallEnabled failed: 0x%08lx/n", hr);
        goto error;
    }

    // Check to see if the firewall is on.
    if (fwEnabled != VARIANT_FALSE)
    {
        *fwOn = TRUE;
        printf("The firewall is on./n");
    }
    else
    {
        printf("The firewall is off./n");
    }

error:

    return hr;
}


HRESULT CWindowsFirewall::TurnOn(IN INetFwProfile* fwProfile)
{
    HRESULT hr = S_OK;
    BOOL fwOn;

    _ASSERT(fwProfile != NULL);

    // Check to see if the firewall is off.
    hr = CWindowsFirewall::IsOn(fwProfile, &fwOn);
    if (FAILED(hr))
    {
        printf("CWindowsFirewall::IsOn failed: 0x%08lx/n", hr);
        goto error;
    }

    // If it is, turn it on.
    if (!fwOn)
    {
        // Turn the firewall on.
        hr = fwProfile->put_FirewallEnabled(VARIANT_TRUE);
        if (FAILED(hr))
        {
            printf("put_FirewallEnabled failed: 0x%08lx/n", hr);
            goto error;
        }

        printf("The firewall is now on./n");
    }

error:

    return hr;
}

HRESULT CWindowsFirewall::TurnOff(IN INetFwProfile* fwProfile)
{
    HRESULT hr = S_OK;
    BOOL fwOn;

    _ASSERT(fwProfile != NULL);

    // Check to see if the firewall is on.
    hr = CWindowsFirewall::IsOn(fwProfile, &fwOn);
    if (FAILED(hr))
    {
        printf("CWindowsFirewall::IsOn failed: 0x%08lx/n", hr);
        goto error;
    }

    // If it is, turn it off.
    if (fwOn)
    {
        // Turn the firewall off.
        hr = fwProfile->put_FirewallEnabled(VARIANT_FALSE);
        if (FAILED(hr))
        {
            printf("put_FirewallEnabled failed: 0x%08lx/n", hr);
            goto error;
        }

        printf("The firewall is now off./n");
    }

error:

    return hr;
}


HRESULT CWindowsFirewall::AppIsEnabled(
            IN INetFwProfile* fwProfile,
            IN const wchar_t* fwProcessImageFileName,
            OUT BOOL* fwAppEnabled
            )
{
    HRESULT hr = S_OK;
    BSTR fwBstrProcessImageFileName = NULL;
    VARIANT_BOOL fwEnabled;
    INetFwAuthorizedApplication* fwApp = NULL;
    INetFwAuthorizedApplications* fwApps = NULL;

    _ASSERT(fwProfile != NULL);
    _ASSERT(fwProcessImageFileName != NULL);
    _ASSERT(fwAppEnabled != NULL);

    *fwAppEnabled = FALSE;

    // Retrieve the authorized application collection.
    hr = fwProfile->get_AuthorizedApplications(&fwApps);
    if (FAILED(hr))
    {
        printf("get_AuthorizedApplications failed: 0x%08lx/n", hr);
        goto error;
    }

    // Allocate a BSTR for the process image file name.
    fwBstrProcessImageFileName = SysAllocString(fwProcessImageFileName);
    if (fwBstrProcessImageFileName == NULL)
    {
        hr = E_OUTOFMEMORY;
        printf("SysAllocString failed: 0x%08lx/n", hr);
        goto error;
    }

    // Attempt to retrieve the authorized application.
    hr = fwApps->Item(fwBstrProcessImageFileName, &fwApp);
    if (SUCCEEDED(hr))
    {
        // Find out if the authorized application is enabled.
        hr = fwApp->get_Enabled(&fwEnabled);
        if (FAILED(hr))
        {
            printf("get_Enabled failed: 0x%08lx/n", hr);
            goto error;
        }

        if (fwEnabled != VARIANT_FALSE)
        {
            // The authorized application is enabled.
            *fwAppEnabled = TRUE;

            printf(
                "Authorized application %lS is enabled in the firewall./n",
                fwProcessImageFileName
                );
        }
        else
        {
            printf(
                "Authorized application %lS is disabled in the firewall./n",
                fwProcessImageFileName
                );
        }
    }
    else
    {
        // The authorized application was not in the collection.
        hr = S_OK;

        printf(
            "Authorized application %lS is disabled in the firewall./n",
            fwProcessImageFileName
            );
    }

error:

    // Free the BSTR.
    SysFreeString(fwBstrProcessImageFileName);

    // Release the authorized application instance.
    if (fwApp != NULL)
    {
        fwApp->Release();
    }

    // Release the authorized application collection.
    if (fwApps != NULL)
    {
        fwApps->Release();
    }

    return hr;
}


HRESULT CWindowsFirewall::AddApp(
            IN INetFwProfile* fwProfile,
            IN const wchar_t* fwProcessImageFileName,
            IN const wchar_t* fwName
            )
{
    HRESULT hr = S_OK;
    BOOL fwAppEnabled;
    BSTR fwBstrName = NULL;
    BSTR fwBstrProcessImageFileName = NULL;
    INetFwAuthorizedApplication* fwApp = NULL;
    INetFwAuthorizedApplications* fwApps = NULL;

    _ASSERT(fwProfile != NULL);
    _ASSERT(fwProcessImageFileName != NULL);
    _ASSERT(fwName != NULL);

    // First check to see if the application is already authorized.
    hr = CWindowsFirewall::AppIsEnabled(
            fwProfile,
            fwProcessImageFileName,
            &fwAppEnabled
            );
    if (FAILED(hr))
    {
        printf("CWindowsFirewall::AppIsEnabled failed: 0x%08lx/n", hr);
        goto error;
    }

    // Only add the application if it isn't already authorized.
    if (!fwAppEnabled)
    {
        // Retrieve the authorized application collection.
        hr = fwProfile->get_AuthorizedApplications(&fwApps);
        if (FAILED(hr))
        {
            printf("get_AuthorizedApplications failed: 0x%08lx/n", hr);
            goto error;
        }

        // Create an instance of an authorized application.
        hr = CoCreateInstance(
                __uuidof(NetFwAuthorizedApplication),
                NULL,
                CLSCTX_INPROC_SERVER,
                __uuidof(INetFwAuthorizedApplication),
                (void**)&fwApp
                );
        if (FAILED(hr))
        {
            printf("CoCreateInstance failed: 0x%08lx/n", hr);
            goto error;
        }

        // Allocate a BSTR for the process image file name.
        fwBstrProcessImageFileName = SysAllocString(fwProcessImageFileName);
        if (fwBstrProcessImageFileName == NULL)
        {
            hr = E_OUTOFMEMORY;
            printf("SysAllocString failed: 0x%08lx/n", hr);
            goto error;
        }

        // Set the process image file name.
        hr = fwApp->put_ProcessImageFileName(fwBstrProcessImageFileName);
        if (FAILED(hr))
        {
            printf("put_ProcessImageFileName failed: 0x%08lx/n", hr);
            goto error;
        }

        // Allocate a BSTR for the application friendly name.
        fwBstrName = SysAllocString(fwName);
        if (SysStringLen(fwBstrName) == 0)
        {
            hr = E_OUTOFMEMORY;
            printf("SysAllocString failed: 0x%08lx/n", hr);
            goto error;
        }

        // Set the application friendly name.
        hr = fwApp->put_Name(fwBstrName);
        if (FAILED(hr))
        {
            printf("put_Name failed: 0x%08lx/n", hr);
            goto error;
        }

        // Add the application to the collection.
        hr = fwApps->Add(fwApp);
        if (FAILED(hr))
        {
            printf("Add failed: 0x%08lx/n", hr);
            goto error;
        }

        printf(
            "Authorized application %lS is now enabled in the firewall./n",
            fwProcessImageFileName
            );
    }

error:

    // Free the BSTRs.
    SysFreeString(fwBstrName);
    SysFreeString(fwBstrProcessImageFileName);

    // Release the authorized application instance.
    if (fwApp != NULL)
    {
        fwApp->Release();
    }

    // Release the authorized application collection.
    if (fwApps != NULL)
    {
        fwApps->Release();
    }

    return hr;
}

HRESULT CWindowsFirewall::PortIsEnabled(
            IN INetFwProfile* fwProfile,
            IN LONG portNumber,
            IN NET_FW_IP_PROTOCOL ipProtocol,
            OUT BOOL* fwPortEnabled
            )
{
    HRESULT hr = S_OK;
    VARIANT_BOOL fwEnabled;
    INetFwOpenPort* fwOpenPort = NULL;
    INetFwOpenPorts* fwOpenPorts = NULL;

    _ASSERT(fwProfile != NULL);
    _ASSERT(fwPortEnabled != NULL);

    *fwPortEnabled = FALSE;

    // Retrieve the globally open ports collection.
    hr = fwProfile->get_GloballyOpenPorts(&fwOpenPorts);
    if (FAILED(hr))
    {
        printf("get_GloballyOpenPorts failed: 0x%08lx/n", hr);
        goto error;
    }

    // Attempt to retrieve the globally open port.
    hr = fwOpenPorts->Item(portNumber, ipProtocol, &fwOpenPort);
    if (SUCCEEDED(hr))
    {
        // Find out if the globally open port is enabled.
        hr = fwOpenPort->get_Enabled(&fwEnabled);
        if (FAILED(hr))
        {
            printf("get_Enabled failed: 0x%08lx/n", hr);
            goto error;
        }

        if (fwEnabled != VARIANT_FALSE)
        {
            // The globally open port is enabled.
            *fwPortEnabled = TRUE;

            printf("Port %ld is open in the firewall./n", portNumber);
        }
        else
        {
            printf("Port %ld is not open in the firewall./n", portNumber);
        }
    }
    else
    {
        // The globally open port was not in the collection.
        hr = S_OK;

        printf("Port %ld is not open in the firewall./n", portNumber);
    }

error:

    // Release the globally open port.
    if (fwOpenPort != NULL)
    {
        fwOpenPort->Release();
    }

    // Release the globally open ports collection.
    if (fwOpenPorts != NULL)
    {
        fwOpenPorts->Release();
    }

    return hr;
}


HRESULT CWindowsFirewall::PortAdd(
            IN INetFwProfile* fwProfile,
            IN LONG portNumber,
            IN NET_FW_IP_PROTOCOL ipProtocol,
            IN const wchar_t* name
            )
{
    HRESULT hr = S_OK;
    BOOL fwPortEnabled;
    BSTR fwBstrName = NULL;
    INetFwOpenPort* fwOpenPort = NULL;
    INetFwOpenPorts* fwOpenPorts = NULL;

    _ASSERT(fwProfile != NULL);
    _ASSERT(name != NULL);

    // First check to see if the port is already added.
    hr = CWindowsFirewall::PortIsEnabled(
            fwProfile,
            portNumber,
            ipProtocol,
            &fwPortEnabled
            );
    if (FAILED(hr))
    {
        printf("CWindowsFirewall::PortIsEnabled failed: 0x%08lx/n", hr);
        goto error;
    }

    // Only add the port if it isn't already added.
    if (!fwPortEnabled)
    {
        // Retrieve the collection of globally open ports.
        hr = fwProfile->get_GloballyOpenPorts(&fwOpenPorts);
        if (FAILED(hr))
        {
            printf("get_GloballyOpenPorts failed: 0x%08lx/n", hr);
            goto error;
        }

        // Create an instance of an open port.
        hr = CoCreateInstance(
                __uuidof(NetFwOpenPort),
                NULL,
                CLSCTX_INPROC_SERVER,
                __uuidof(INetFwOpenPort),
                (void**)&fwOpenPort
                );
        if (FAILED(hr))
        {
            printf("CoCreateInstance failed: 0x%08lx/n", hr);
            goto error;
        }

        // Set the port number.
        hr = fwOpenPort->put_Port(portNumber);
        if (FAILED(hr))
        {
            printf("put_Port failed: 0x%08lx/n", hr);
            goto error;
        }

        // Set the IP protocol.
        hr = fwOpenPort->put_Protocol(ipProtocol);
        if (FAILED(hr))
        {
            printf("put_Protocol failed: 0x%08lx/n", hr);
            goto error;
        }

        // Allocate a BSTR for the friendly name of the port.
        fwBstrName = SysAllocString(name);
        if (SysStringLen(fwBstrName) == 0)
        {
            hr = E_OUTOFMEMORY;
            printf("SysAllocString failed: 0x%08lx/n", hr);
            goto error;
        }

        // Set the friendly name of the port.
        hr = fwOpenPort->put_Name(fwBstrName);
        if (FAILED(hr))
        {
            printf("put_Name failed: 0x%08lx/n", hr);
            goto error;
        }

        // Opens the port and adds it to the collection.
        hr = fwOpenPorts->Add(fwOpenPort);
        if (FAILED(hr))
        {
            printf("Add failed: 0x%08lx/n", hr);
            goto error;
        }

        printf("Port %ld is now open in the firewall./n", portNumber);
    }

error:

    // Free the BSTR.
    SysFreeString(fwBstrName);

    // Release the open port instance.
    if (fwOpenPort != NULL)
    {
        fwOpenPort->Release();
    }

    // Release the globally open ports collection.
    if (fwOpenPorts != NULL)
    {
        fwOpenPorts->Release();
    }

    return hr;
}


int CWindowsFirewall::Test()
{
    HRESULT hr = S_OK;
    HRESULT comInit = E_FAIL;
    INetFwProfile* fwProfile = NULL;

    // Initialize COM.
    comInit = CoInitializeEx(
                0,
                COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE
                );

   // Ignore RPC_E_CHANGED_MODE; this just means that COM has already been
   // initialized with a different mode. Since we don't care what the mode is,
   // we'll just use the existing mode.
   if (comInit != RPC_E_CHANGED_MODE)
   {
        hr = comInit;
        if (FAILED(hr))
        {
            TRACE("CoInitializeEx failed: 0x%08lx/n", hr);
            goto error;
        }
   }

    // Retrieve the firewall profile currently in effect.
    hr = CWindowsFirewall::Initialize(&fwProfile);
    if (FAILED(hr))
    {
        TRACE("CWindowsFirewall::Initialize failed: 0x%08lx/n", hr);
        goto error;
    }

    // Turn off the firewall.
//     hr = CWindowsFirewall::TurnOff(fwProfile);
//     if (FAILED(hr))
//     {
//         TRACE("CWindowsFirewall::TurnOff failed: 0x%08lx/n", hr);
//         goto error;
//     }
//
//     // Turn on the firewall.
//     hr = CWindowsFirewall::TurnOn(fwProfile);
//     if (FAILED(hr))
//     {
//         TRACE("CWindowsFirewall::TurnOn failed: 0x%08lx/n", hr);
//         goto error;
//     }

    // Add Windows Messenger to the authorized application collection.
     hr = CWindowsFirewall::AddApp(
             fwProfile,
             L"%ProgramFiles%//Messenger//msmsgs.exe",
             L"Windows Messenger"
             );
     if (FAILED(hr))
     {
         TRACE("CWindowsFirewall::AddApp failed: 0x%08lx/n", hr);
         goto error;
     }

 

error:

    // Release the firewall profile.
    CWindowsFirewall::Cleanup(fwProfile);

    // Uninitialize COM.
    if (SUCCEEDED(comInit))
    {
        CoUninitialize();
    }

    return 0;
}

4.C语言中怎样判断汉字
其实判断汉字的代码很简单,简单到只有一行就可以了,但不理解汉字编码的基础,这一行代码却万万无法理解。

常用的字符编码有以下三种:
1、ASCII 只支持英文,全部为8位
2、DBCS  支持英文和中文,但中文需要两个字节(16位)
3、UNICODE 支持英文和中文,英文和中文都需要两个字节

ASCII是DOS时代的,无法支持中文。DBCS是Win9x支持的字符集。UNICODE是win2k和xp支持的字符集。
而汉字的编码目前有GB2312-1980和GB18030-2000,GB2312就是DBCS类型的汉字编码,GB18030就是UNICODE的汉字编码,当然GB18030兼容GB2312,也就是说GB18030也支持DBCS的字符处理方式。虽然GB18030是2000年后强制执行的国家标准,但目前使用最多的还是GB2312编码,而且GB2312也足够处理你所用到的汉字了。还有GBK编码是GB2312的增强版。

这里我仅支持GB2312。由于GB2312是中国大陆制定的标准,所以繁体中文并不在GB2312的编码中,如果你的程序需要支持繁体中文,则还需要处理Big5编码。其实也很简单。

下面说一下在C中如何处理GB2312编码的汉字。以VC6.0为例,如果声明变量的类型为wchar_t则是UNICODE编码,如果是char则是DBCS编码比如我的一个函数声明是:
void Justify (HDC hdc, PTSTR pText, RECT * prc, int iAlign)   
其中的pText是PTSTR类型,PTSTR在WINNT.H中有两个定义(WINNT.H中的这段代码我删掉了中间无关的部分)
#ifdef  UNICODE
typedef LPWSTR PTSTR, LPTSTR;//如果是UNICODE编码,则定义PTSTR为LPWSTR类型
#else
typedef LPSTR PTSTR, LPTSTR;//如果是不是UNICODE编码,则定义PTSTR为LPSTR类型
#endif

LPSTR定义为CHAR的指针
LPSWSTR定义为WCHAR的指针
CHAR定义为char类型
WCHAR定义为wchar_t类型
而wchar_t定义为unsigned short类型,它是16位,两个字节,无符号短整数

是UNICODE还是非UNICODE取决于你的编译选项,如果在[工程]-[选项]-[C/C++]的[预处理程序定义]中填入了_UNICODE,那么程序会用wchar_t指针来定义LPSTR,如果没有_UNICODE,那么程序会用char指针来定义LPSTR,这样带来的区别就是,你接受到的pText中的字节内容是不一样的,[i服了you]这个字串如果在没有定义_UNICODE的情况下,是8个字节,而在定义了_UNICODE的情况下是12个字节。反映到程序中就是,如果没有定义_UNICODE,那么就要把英文字符当成1个字节来处理,而汉字字符的编码是采用GB2312编码规范来的;如果定义了_UNICODE,那么英文字符要当成2个字节来处理,而汉字字符的编码是采用UNICODE编码来的。举例来说,win98不采用UNICODE编码而采用的是DBCS编码,为了让我的程序既可以在XP下运行又可以在Win98下运行,我没有定义_UNICODE。这样我的程序代码就要把字符串当成DBCS编码来处理,也就是英文字符是1个字节,中文字符是2个字节,中文编码采用GB2312编码。用Justify来说明:
我给pText传递来[你]这个汉字,那么pText应该有两个字节来存放[你]这个字,设置段点来读一下pText的内容。
void Justify (HDC hdc, PTSTR pText, RECT * prc, int iAlign)
{
static TCHAR szText[] = {TEXT ("你")} ;

pText=szText;
}
设断调试会发现*pText=-60,怎么会这样呢,原因是没有按unsigned char来转换*pText的值,修改代码如下:
void Justify (HDC hdc, PTSTR pText, RECT * prc, int iAlign)
{
static TCHAR szText[] = {TEXT ("你")} ;
unsigned char sqChar[20];//这个变量就是为了强制转换类型用的

pText=szText;
sqChar[0]=*pText;
sqChar[1]=*(pText+1);
}
这时下断查看sqChar[0]=196,sqChar[1]=227就对了,为什么呢,因为它和GB2312的编码是一样的。
GB2312-80编码的编码范围是高位0xa1-0xfe,低位是 0xa1-0xfe ,其中汉字范围为 0xb0a1 和 0xf7fe,如果只是简单地判断汉字,则只要查看高字节是否大于等于0xa1就可以了,还有就是,全角字符的高字节统统等于0xa3,所以很容易可以区别出全角字符来。

如果你希望你的程序能支持到GB18030,那么就去找GB18030的规范来看看。

网上有很多判断汉字的说法,你只要记住,你要支持的编码是哪个?GB2312、GBK、GB18030?每个编码有自己的编码范围或者规范,网上之所以有不同的说法,正是因为他们互相说的不是同一种编码方式。我这里说的是GB2312的编码,如果你的程序要编译成支持UNICODE的话,那么这段代码就要修改成对应UNICODE规范的代码了。

附简单的测试汉字、全角字符、英文的程序:

//test.c
//源代码作者:夏克 sequh@126.com
//新建Win32 Application工程,把test.c加入,运行,试着修改szText的值,来观察代码效果

#include <windows.h>

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szText[] = {TEXT ("i服,了。uy")} ;
PTSTR pText;
int i;
unsigned char sqChar[20];

pText=szText;
while (*pText != '/0')
{
i=IsGB(pText);

switch(i)
{
case 0:
pText++;
MessageBox (NULL, TEXT ("发现数字、英文字符或英文标点"), TEXT ("Hello"), 0);
break;
case 1:
pText++;
pText++;
MessageBox (NULL, TEXT ("发现全角字符"), TEXT ("Hello"), 0);
break;
case 2:
pText++;
pText++;
MessageBox (NULL, TEXT ("发现汉字"), TEXT ("Hello"), 0);
break;
}
}

return 0 ;
}

int IsGB(PTSTR pText)
{
unsigned char sqChar[20];
sqChar[0]=*pText;
if (sqChar[0]>=0xa1)
if (sqChar[0]==0xa3)
return 1;//全角字符
else
return 2;//汉字
else
return 0;//英文、数字、英文标点
}

5.怎么把界面弹到最上层
在ShowWindow(SW_SHOW)后加入

SetForegroundWindow();

6.文件关联怎样做
修改注册表  
  例子:  
   
  HKEY_CLASSES_ROOT   键下  
  [HKEY_CLASSES_ROOT/.mp3]  
  @="Mp3Player"  
   
  [HKEY_CLASSES_ROOT/Mp3Player]  
  @="Mp3Player"  
   
  //图标  
  [HKEY_CLASSES_ROOT/AudioDecoder/defaultIcon]  
  @="C://Mp3Player.EXE,1"  
   
   
  [HKEY_CLASSES_ROOT/AudioDecoder/Shell]  
   
  [HKEY_CLASSES_ROOT/AudioDecoder/Shell/open]  
   
  //   打开的程序  
  [HKEY_CLASSES_ROOT/AudioDecoder/Shell/open/command]  
  @="Mp3Player.EXE   %1"

在CMyApp::InitInstance()中加入或修改以下代码  
  EnableShellOpen();  
  RegisterShellFileTypes(TRUE);  
  CCommandLineInfo   cmdInfo;  
  ParseCommandLine(cmdInfo);  
  if(!ProcessShellCommand(cmdInfo))  
  return   FALSE;  
   
  在以下代码以前  
  pMainFrame->ShowWindow(SW_SHOWMAXIMIZED);  
  pMainFrame->UpdateWindow();  

7.如何通过HTTP下载一个文件
#include <Urlmon.h>
#pragma comment( lib, "Urlmon.lib")

URLDownloadToFile(0, "http://www.abc.com/abc.exe", "c://abc.exe", 0, 0);

8.复制位图到剪贴板
复制一幅位图到剪贴板相当简单,需要记住的一个是如果位图需要调色盘,
你应当将调色盘也复制。

函数一:复制设备相关位图到剪贴板

CopyBitmapToClipboard()函数复制一幅DDB位图到剪贴板,如果提供调色盘它将
同时复制调色盘。注意在最后调用Detach()。这一点很重要,因为此时GDI对象
的物主已经传送至剪贴板。

// CopyBitmapToClipboard- Copies a device-dependent bitmap to clipboard
// pWnd- Pointer to window that opens the clipboard
// bitmap- The device-dependent bitmap
// pPal- Pointer to logical palette - Can be NULL
// NOTE- GDI objects are detached from bitmap & pPal
//  as the clipboard owns them after the copy
void CopyBitmapToClipboard( const CWnd *pWnd, CBitmap& bitmap, CPalette* pPal )
{
 ::OpenClipboard(pWnd->GetSafeHwnd());
 ::EmptyClipboard() ;
 if( pPal )
  ::SetClipboardData (CF_PALETTE, pPal->GetSafeHandle() ) ;
 ::SetClipboardData (CF_BITMAP, bitmap.GetSafeHandle() ) ;
 ::CloseClipboard () ;
 bitmap.Detach();
 if( pPal )
  pPal->Detach();
}
函数二:复制设备无关位图到剪贴板

CopyDIBToClipboard()函数和CopyBitmapToClipboard()非常相似。内存句柄包
含了BITMAPINFO 和位图的位信息,通过GlobalAlloc()分配。

// CopyDIBToClipboard- Copies a device-dependent bitmap to clipboard
// pWnd- Pointer to window that opens the clipboard
// hDIB- Memory handle that contains BITMAPINFO & bitmap bits
// pPal- Pointer to logical palette - Can be NULL
// NOTE- GDI objects are detached from bitmap & pPal
//  as the clipboard owns them after the copy
void CopyDIBToClipboard( const CWnd *pWnd, HGLOBAL hDIB, CPalette* pPal )
{
 ::OpenClipboard(pWnd->GetSafeHwnd());
 ::EmptyClipboard();
 if( pPal )
  ::SetClipboardData (CF_PALETTE, pPal->GetSafeHandle() ) ;
 ::SetClipboardData (CF_DIB, hDIB ) ;
 ::CloseClipboard () ;
 bitmap.Detach();
 if( pPal )
  pPal->Detach();
}

函数三:复制一幅windows图象到剪贴板

void CopyWndToClipboard( CWnd *pWnd )
{
 CBitmap bitmap;
 CClientDCdc(pWnd);
 CDC memDC;
 CRectrect;
 
 memDC.CreateCompatibleDC(&dc);
 
 pWnd->GetWindowRect(rect);
 
 bitmap.CreateCompatibleBitmap(&dc, rect.Width(),rect.Height() );
 
 CBitmap* pOldBitmap = memDC.SelectObject(&bitmap);
 memDC.BitBlt(0, 0, rect.Width(),rect.Height(), &dc, 0, 0, SRCCOPY);
 
 pWnd->OpenClipboard() ;
 EmptyClipboard() ;
 SetClipboardData (CF_BITMAP, bitmap.GetSafeHandle() ) ;
 CloseClipboard () ;
 
 memDC.SelectObject(pOldBitmap);
 bitmap.Detach();
}
使用CopyBitmapToClipboard(this,CBitmap::FromHandle(hBitmap),pPal);

9.检测internet连线状态
在线返回 TRUE, 掉线返回 FALSE。遍历系统中所有 RAS 连接判断连接情况。Win2K/98 VC6 通过
BOOL GetConnectState()
{
 
 LPRASCONN lpRasConn = NULL;
 DWORD cbBuf = 0;
 DWORD cConn = 0;
 DWORD dwRet = 0;
 HRASCONN hrasconn;
 RASCONNSTATUS rasStatus;
 UINT ndx;
 
 // enumerate connections
 cbBuf = sizeof(RASCONN);
 
 if ( (lpRasConn = ( LPRASCONN ) malloc((UINT)cbBuf)) != NULL)
 {
  lpRasConn->dwSize = sizeof( RASCONN );
  dwRet = RasEnumConnections( lpRasConn, &cbBuf, &cConn );
  for (ndx = 0; ndx < cConn; ndx++)
  {
   // get to HRASCONN
   hrasconn = lpRasConn[ndx].hrasconn;
   // get connection status
   rasStatus.dwSize = sizeof(RASCONNSTATUS);
   dwRet = RasGetConnectStatus( hrasconn, &rasStatus );
   if ( dwRet )
    return 0;
   else
   {
    if (rasStatus.rasconnstate == RASCS_Connected)
     return 1;
    else return 0;
   }
  }
 }
 else
 {
  return 0;
 }
 
}
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值