杂项,编码转换的函数在垃圾桶找到了,愿愿原创。

#include "stdafx.h"

#include "MessageDialog.h"
//#include "F:\taiZhangProjVs2010\taiZhangProj2013-11-10本阶段完整版新版学习\taiZhangFormatTrans\taiZhangFormatTrans\MessageDialogExp.h"
#include "CommonFunction.h"
#include <stdio.h>
#include <windows.h>
#include <Psapi.h>
#pragma comment(lib, "psapi.lib")
//#pragma comment(lib,"MessageDialog.lib")
//#include "MessageDialogExp.h"
//#pragma comment(lib,"MessageDialog.lib")
namespace CommonFunction{
    CString GenerateLetter(const int number)
    {
        CString letter;
        switch (number)
        {
        case 0: letter = _T("Z"); break;
        case 1: letter = _T("A"); break;
        case 2: letter = _T("B"); break;
        case 3: letter = _T("C"); break;
        case 4: letter = _T("D"); break;
        case 5: letter = _T("E"); break;
        case 6: letter = _T("F"); break;
        case 7: letter = _T("G"); break;
        case 8: letter = _T("H"); break;
        case 9: letter = _T("I"); break;
        case 10: letter = _T("J"); break;
        case 11: letter = _T("K"); break;
        case 12: letter = _T("L"); break;
        case 13: letter = _T("M"); break;
        case 14: letter = _T("N"); break;
        case 15: letter = _T("O"); break;
        case 16: letter = _T("P"); break;
        case 17: letter = _T("Q"); break;
        case 18: letter = _T("R"); break;
        case 19: letter = _T("S"); break;
        case 20: letter = _T("T"); break;
        case 21: letter = _T("U"); break;
        case 22: letter = _T("V"); break;
        case 23: letter = _T("W"); break;
        case 24: letter = _T("X"); break;
        case 25: letter = _T("Y"); break;
        default: letter= _T("Sorry,there is no answer!");break;
        }
        return letter;
    }
    CString ChangeNumber(const int columnNum)
    {
        int i = columnNum / 26;
        int j = columnNum % 26;
        CString columnName;
        CString k;
        if (i == 0)
        {
            columnName = GenerateLetter(j);
        }
        else
        {
            k = GenerateLetter(j);
            columnName = ChangeNumber(i) + k;
        }
        return columnName;
    }
    CString PurgeCStringWasteCharacter(const CString& originalStr,const CString& charactor)
    {
        //处理后保存的字符串
        CString _str;
        for(int i=0;i<originalStr.GetLength();++i)
        {
            if(originalStr[i]==charactor)
            {
            }
            else
            {
                _str+=originalStr[i];
            }
        }
        return _str;
    }
    CString GetAppPath(void)
    {
        CString   strAppPath=_T("");   
        ::GetModuleFileName(NULL,strAppPath.GetBuffer(MAX_PATH),MAX_PATH);   
        strAppPath.ReleaseBuffer();   
        int   nPos=strAppPath.ReverseFind('\\');   
        if(nPos!=-1)   
            strAppPath=strAppPath.Left(nPos); //   结尾没有   '\'   
        else   
            strAppPath.Empty();   
        ASSERT(!strAppPath.IsEmpty());
        return strAppPath;
    }

    void dump_com_error(_com_error &e)
    {
        try{
            CString ErrorStr;

            _bstr_t bstrSource(e.Source());
            _bstr_t bstrDescription(e.Description());
            ErrorStr.Format(_T("_com_error Error\n\tCode = %08lx\n\tCode meaning = %s\n\tSource = %s\n\tDescription = %s\n"),
                e.Error(), e.ErrorMessage(), (LPCWSTR)bstrSource, (LPCWSTR)bstrDescription);
            //ShowMessageDialog(ErrorStr);
            ::AfxMessageBox(ErrorStr);
        }
        catch(...)   
        {   
            ::MessageBox(NULL,   _T("Form_View_Verify _com_error错误提示框显示失败!"),   _T("Catch-All"),   
                MB_SETFOREGROUND   |   MB_OK);   
            return;
        }  
    }
    /*

    功能: 实现数组的二分法查找(只算法只适合按从小到大排列的数组)

    返回值:关键字在数组中的下标, 返回-1表示未找到

    a[]:    要搜索的数组

    len:    数组元素个数

    key:    要查找的关键字

*/
int binSearch(const VARIANT (*pbstr)[2], int len, const CString& key)

{

扫描二维码关注公众号,回复: 3342883 查看本文章

    int i = len / 2;

    int ii = 0;

    if(len < 1)

        return -1;

    if((key.Compare(CString(pbstr[i][1].bstrVal)) >0) && (len - i > 0))

    {
        ii = binSearch(&pbstr[i+1], len - i - 1, key);    // 在后半段数组中查找
       // ii = binSearch(a+i+1, len - i - 1, key);    // 在后半段数组中查找

        if(ii != -1)

            return ii + i + 1;                      // 加上数组前半段的长度

        else

            return -1;

    }

    else if((key.Compare(CString(pbstr[i][1].bstrVal)) <0) && i > 0)                  // 在前半段数组中查找

        return binSearch(&pbstr[0], i, key);

    else if(key.Compare(CString(pbstr[i][1].bstrVal))==0)

        return i;                                   // 返回关键字在数组中的下标

    else

        return -1;                                  // 未在数组中找到关键字

}
BOOL CreateMDBAndConnection(ADOX::_CatalogPtr& pCatalog,const CString &strMDBFileName)
{
    //WIN32_FIND_DATA fd;
    try
    {
        CString StrSql;
        StrSql.Format(_T("Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Mode=Share Deny Read|Share Deny Write;Data Source=%s;")
            ,strMDBFileName);
        HRESULT hr = S_OK;

        hr = pCatalog.CreateInstance(__uuidof (ADOX::Catalog));
        if(FAILED(hr))
            _com_issue_error(hr);
        else
        {
            pCatalog->Create(_bstr_t(StrSql)); //Create mdb
            _ConnectionPtr cn=pCatalog->GetActiveConnection();

            cn->GetProperties()->GetItem(_variant_t("Jet OLEDB:Max Buffer Size"))->PutValue(_variant_t((long)512,VT_I4));//jet4.0会将输入修正到0x100~0x10000之间  
            cn->GetProperties()->GetItem(_variant_t("Jet OLEDB:Recycle Long-Valued Pages"))->PutValue(_variant_t((short)-1,VT_BOOL));
            cn->GetProperties()->GetItem(_variant_t("Jet OLEDB:Page Timeout"))->PutValue(_variant_t((long)512,VT_I4));//
            cn->GetProperties()->GetItem(_variant_t("Jet OLEDB:Flush Transaction Timeout"))->PutValue(_variant_t((long)512,VT_I4));//
        }
    }catch(std::exception &exp)
    {
        exp.what();
        return FALSE;
    }
    catch(_com_error e)
    {
        dump_com_error(e);
        return FALSE;
    }
    catch(...)
    {  
        return FALSE;
    }
    return TRUE;
}

//判断该文件是否是复合式Excel文件
bool IsXLSFile(CString fileName)
{

    HRESULT hr;
    IStorage *pStg = NULL;
    //USES_CONVERSION;                // (注6)

    //LPCOLESTR lpwFileName = T2COLE( lpFileName );   // 转换T类型为宽字符

    hr = ::StgIsStorageFile( fileName ); // 是复合文件吗?
    if( FAILED(hr) )    return false;
    //::AfxMessageBox(_T("after StgIsStorageFile"));
    //return true;
    hr = ::StgOpenStorage(          // 打开复合文件
        fileName,            // 文件名称
        NULL,
        STGM_READ | STGM_SHARE_DENY_WRITE,
        0,
        0,
        &pStg);             // 得到根存储接口指针

    CLSID CLSID_Excel={0x00020820,0x0000,0x0000,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}};
    CLSID pclsid;
    ::ReadClassStg(
        pStg,
        &pclsid
        );
    if( pStg )  pStg->Release();

    if(IsEqualGUID(CLSID_Excel,pclsid)==FALSE)
    {
        return false;}
    else{return true;}
}
char * __stdcall UnicodeToUtf8( const WCHAR* wstr )
{
    const WCHAR* w;
    // Convert unicode to utf8
    int len = 0;
    for ( w = wstr; *w; w++ ) {

        if ( *w < 0x0080 ) len++;
        else if ( *w < 0x0800 ) len += 2;
        else len += 3;
    }
    
    unsigned char* szOut = ( unsigned char* )malloc( len+1 );

    if ( szOut == NULL )
        return NULL;

    int i = 0;
    for ( w = wstr; *w; w++ ) {
        if ( *w < 0x0080 )
            szOut[i++] = ( unsigned char ) *w;
        else if ( *w < 0x0800 ) {
            szOut[i++] = 0xc0 | (( *w ) >> 6 );
            szOut[i++] = 0x80 | (( *w ) &0x3f );
        }
        else {
            szOut[i++] = 0xe0 | (( *w ) >> 12 );
            szOut[i++] = 0x80 | (( ( *w ) >> 6 ) &0x3f );
            szOut[i++] = 0x80 | (( *w ) &0x3f );
        }    }

    szOut[ i ] = '\0';
    //CStringA strOut=(char *)szOut;
    //free(szOut);
    //strOut.Format(_T("%s"),(char *)szOut);
    return (char *)szOut;
}
}

猜你喜欢

转载自blog.csdn.net/tom_xuzg/article/details/82704952