#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)
{
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;
}
}