📄 etc_uty.cpp
字号:
//- break;
//- }
//- if( nDriveOrg >= i ){
//- strcpy( szPath3, szPathSrc );
//- strcat( szPath3, szPath2 );
//- strcpy( szPath2, szPath3 );
//- break;
//- }
//- if( 2 == strlen( szPathSrc ) ){
//- if( szPathSrc[1] == ':' ){
//- strcpy( szPath3, szPathSrc );
//- strcat( szPath3, szPath2 );
//- strcpy( szPath2, szPath3 );
//- break;
//- }
//- }
//- nFind = ::FindFirstFile( szPathSrc, (WIN32_FIND_DATA*)&wfd );
//- if( INVALID_HANDLE_VALUE == nFind ){
//- strcpy( szPath3, szPathSrc );
//- strcat( szPath3, szPath2 );
//- strcpy( szPath2, szPath3 );
//- break;
//- }
//- ::FindClose( nFind );
//- }
//- strcpy( pszFilePathDes, szPath2 );
//- /* 最悪の場合を考えて、存在しないロングパス名を生成した場合は、もとのパス名にする */
//- if( -1 == _access( pszFilePathDes, 0 ) ){
//- ::MYMESSAGEBOX( NULL, MB_OK | MB_ICONINFORMATION, "作者に教えて欲しいエラー",
//- "ロングファイルネームの生成でエラーが出ましたので、\n元のファイル名を使います。\n\nもとのファイル名=[%s]\n失敗したロングファイル名=[%s]",
//- pszFilePathSrc, pszFilePathDes
//- );
//- strcpy( pszFilePathDes, pszFilePathSrc );
//- }
//- return TRUE;
}
/* ファイルのフルパスを、フォルダとファイル名に分割 */
/* [c:\work\test\aaa.txt] → [c:\work\test] + [aaa.txt] */
void SplitPath_FolderAndFile( const char* pszFilePath, char* pszFolder, char* pszFile )
{
char szDrive[_MAX_DRIVE];
char szDir[_MAX_DIR];
char szFname[_MAX_FNAME];
char szExt[_MAX_EXT];
int nFolderLen;
int nCharChars;
_splitpath( pszFilePath, szDrive, szDir, szFname, szExt );
if( NULL != pszFolder ){
strcpy( pszFolder, szDrive );
strcat( pszFolder, szDir );
/* フォルダの最後が半角かつ'\\'の場合は、取り除く */
nFolderLen = strlen( pszFolder );
if( 0 < nFolderLen ){
nCharChars = &pszFolder[nFolderLen] - CMemory::MemCharPrev( pszFolder, nFolderLen, &pszFolder[nFolderLen] );
if( 1 == nCharChars && '\\' == pszFolder[nFolderLen - 1] ){
pszFolder[nFolderLen - 1] = '\0';
}
}
}
if( NULL != pszFile ){
strcpy( pszFile, szFname );
strcat( pszFile, szExt );
}
return;
}
/* システムリソースを調べる
Win16 の時は、GetFreeSystemResources という関数がありました。しかし、Win32 ではありません。
サンクを作るだの DLL を作るだのは難しすぎます。簡単な方法を説明します。
お使いの Windows95 の [アクセサリ]-[システムツール] にリソースメータがあるのなら、
c:\windows\system\rsrc32.dll があるはずです。これは、リソースメータという Win32 アプリが、
Win16 の GetFreeSystemResources 関数を呼ぶ為の DLL です。これを使いましょう。
*/
BOOL GetSystemResources(
int* pnSystemResources,
int* pnUserResources,
int* pnGDIResources
)
{
#define GFSR_SYSTEMRESOURCES 0x0000
#define GFSR_GDIRESOURCES 0x0001
#define GFSR_USERRESOURCES 0x0002
HINSTANCE hlib;
int (CALLBACK *GetFreeSystemResources)( int );
hlib = ::LoadLibrary( "RSRC32.dll" );
if( (int)hlib > 32 ){
GetFreeSystemResources = (int (CALLBACK *)( int ))GetProcAddress(
hlib,
"_MyGetFreeSystemResources32@4"
);
if( GetFreeSystemResources != NULL ){
*pnSystemResources = GetFreeSystemResources( GFSR_SYSTEMRESOURCES );
*pnUserResources = GetFreeSystemResources( GFSR_USERRESOURCES );
*pnGDIResources = GetFreeSystemResources( GFSR_GDIRESOURCES );
::FreeLibrary( hlib );
return TRUE;
}else{
::FreeLibrary( hlib );
return FALSE;
}
}else{
return FALSE;
}
}
/* システムリソースのチェック */
BOOL CheckSystemResources( const char* pszAppName )
{
int nSystemResources;
int nUserResources;
int nGDIResources;
char* pszResourceName;
/* システムリソースの取得 */
if( GetSystemResources( &nSystemResources, &nUserResources, &nGDIResources ) ){
// MYTRACE( "nSystemResources=%d\n", nSystemResources );
// MYTRACE( "nUserResources=%d\n", nUserResources );
// MYTRACE( "nGDIResources=%d\n", nGDIResources );
pszResourceName = NULL;
if( nSystemResources <= 5 ){
pszResourceName = "システム ";
}else
if( nUserResources <= 5 ){
pszResourceName = "ユーザー ";
}else
if( nGDIResources <= 5 ){
pszResourceName = "GDI ";
}
if( NULL != pszResourceName ){
::MessageBeep( MB_ICONHAND );
::MessageBeep( MB_ICONHAND );
// if( IDYES == ::MYMESSAGEBOX( NULL, MB_YESNO | MB_ICONSTOP | MB_APPLMODAL | MB_TOPMOST, pszAppName,
::MYMESSAGEBOX( NULL, MB_OK | /*MB_YESNO | */ MB_ICONSTOP | MB_APPLMODAL | MB_TOPMOST, pszAppName,
"%sリソースが極端に不足しています。\n\
このまま%sを起動すると、正常に動作しない可能性があります。\n\
新しい%sの起動を中断します。\n\
\n\
システム リソース\t残り %d%%\n\
User リソース\t残り %d%%\n\
GDI リソース\t残り %d%%\n\n",
pszResourceName,
pszAppName,
pszAppName,
nSystemResources,
nUserResources,
nGDIResources
);
// ) ){
return FALSE;
// }
}
}
return TRUE;
}
struct VS_VERSION_INFO_HEAD {
WORD wLength;
WORD wValueLength;
WORD bText;
WCHAR szKey[16];
VS_FIXEDFILEINFO Value;
};
/*! リソースから製品バージョンの取得
@date 2004.05.13 Moca 一度取得したらキャッシュする
*/
void GetAppVersionInfo(
HINSTANCE hInstance,
int nVersionResourceID,
DWORD* pdwProductVersionMS,
DWORD* pdwProductVersionLS
)
{
HRSRC hRSRC;
HGLOBAL hgRSRC;
VS_VERSION_INFO_HEAD* pVVIH;
/* リソースから製品バージョンの取得 */
*pdwProductVersionMS = 0;
*pdwProductVersionLS = 0;
static bool bLoad = false;
static DWORD dwVersionMS = 0;
static DWORD dwVersionLS = 0;
if( hInstance == NULL && bLoad ){
*pdwProductVersionMS = dwVersionMS;
*pdwProductVersionLS = dwVersionLS;
return;
}
if( NULL != ( hRSRC = ::FindResource( hInstance, MAKEINTRESOURCE(nVersionResourceID), RT_VERSION ) )
&& NULL != ( hgRSRC = ::LoadResource( hInstance, hRSRC ) )
&& NULL != ( pVVIH = (VS_VERSION_INFO_HEAD*)::LockResource( hgRSRC ) )
){
*pdwProductVersionMS = pVVIH->Value.dwProductVersionMS;
*pdwProductVersionLS = pVVIH->Value.dwProductVersionLS;
dwVersionMS = pVVIH->Value.dwProductVersionMS;
dwVersionLS = pVVIH->Value.dwProductVersionLS;
}
if( hInstance == NULL ){
bLoad = true;
}
return;
}
/* アクティブにする */
void ActivateFrameWindow( HWND hwnd )
{
if( ::IsIconic( hwnd ) ){
::ShowWindow( hwnd, SW_RESTORE );
}
else if ( ::IsZoomed( hwnd ) ){
::ShowWindow( hwnd, SW_MAXIMIZE );
}
else {
::ShowWindow( hwnd, SW_SHOW );
}
::SetForegroundWindow( hwnd );
::BringWindowToTop( hwnd );
return;
}
//@@@ 2002.01.24 Start by MIK
/*!
文字列がURLかどうかを検査する。
@param pszLine [in] 文字列
@param nLineLen [in] 文字列の長さ
@param pnMatchLen [out] URLの長さ
@retval TRUE URLである
@retval FALSE URLでない
@note 関数内に定義したテーブルは必ず static const 宣言にすること(性能に影響します)。
url_char の値は url_table の配列番号+1 になっています。
新しい URL を追加する場合は #define 値を修正してください。
url_table は頭文字がアルファベット順になるように並べてください。
*/
BOOL IsURL( const char *pszLine, int nLineLen, int *pnMatchLen )
{
struct _url_table_t {
char name[12];
int length;
bool is_mail;
};
static const struct _url_table_t url_table[] = {
/* アルファベット順 */
"file://", 7, false, /* 1 */
"ftp://", 6, false, /* 2 */
"gopher://", 9, false, /* 3 */
"http://", 7, false, /* 4 */
"https://", 8, false, /* 5 */
"mailto:", 7, true, /* 6 */
"news:", 5, false, /* 7 */
"nntp://", 7, false, /* 8 */
"prospero://", 11, false, /* 9 */
"telnet://", 9, false, /* 10 */
"tp://", 5, false, /* 11 */ //2004.02.02
"ttp://", 6, false, /* 12 */ //2004.02.02
"wais://", 7, false, /* 13 */
"{", 0, false /* 14 */ /* '{' is 'z'+1 : terminate */
};
/* テーブルの保守性を高めるための定義 */
const char urF = 1;
const char urG = 3;
const char urH = 4;
const char urM = 6;
const char urN = 7;
const char urP = 9;
const char urT = 10;
const char urW = 13; //2004.02.02
static const char url_char[] = {
/* +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* +00: */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* +10: */
0, -1, 0, -1, -1, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, -1, /* +20: " !"#$%&'()*+,-./" */
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 0, -1, /* +30: "0123456789:;<=>?" */
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* +40: "@ABCDEFGHIJKLMNO" */
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 0, 0, -1, /* +50: "PQRSTUVWXYZ[\]^_" */
0, -1, -1, -1, -1, -1,urF,urG,urH, -1, -1, -1, -1,urM,urN, -1, /* +60: "`abcdefghijklmno" */
urP, -1, -1, -1,urT, -1, -1,urW, -1, -1, -1, 0, 0, 0, -1, 0, /* +70: "pqrstuvwxyz{|}~ " */
/* あと128バイト犠牲にすればif文を2箇所削除できる */
/* 0 : not url char
* -1 : url char
* other: url head char --> url_table array number + 1
*/
};
const unsigned char *p = (const unsigned char*)pszLine;
const struct _url_table_t *urlp;
int i;
if( *p & 0x80 ) return FALSE; /* 2バイト文字 */
if( 0 < url_char[*p] ){ /* URL開始文字 */
for(urlp = &url_table[url_char[*p]-1]; urlp->name[0] == *p; urlp++){ /* URLテーブルを探索 */
if( (urlp->length <= nLineLen) && (memcmp(urlp->name, pszLine, urlp->length) == 0) ){ /* URLヘッダは一致した */
p += urlp->length; /* URLヘッダ分をスキップする */
if( urlp->is_mail ){ /* メール専用の解析へ */
if( IsMailAddress((const char*)p, nLineLen - urlp->length, pnMatchLen) ){
*pnMatchLen = *pnMatchLen + urlp->length;
return TRUE;
}
return FALSE;
}
for(i = urlp->length; i < nLineLen; i++, p++){ /* 通常の解析へ */
if( (*p & 0x80) || (!(url_char[*p])) ) break; /* 終端に達した */
}
if( i == urlp->length ) return FALSE; /* URLヘッダだけ */
*pnMatchLen = i;
return TRUE;
}
}
}
return IsMailAddress(pszLine, nLineLen, pnMatchLen);
}
/* 現在位置がメールアドレスならば、NULL以外と、その長さを返す */
BOOL IsMailAddress( const char* pszBuf, int nBufLen, int* pnAddressLenfth )
{
// int i;
int j;
// int wk_nBegin;
// int wk_nEnd;
// int nAtPos;
int nDotCount;
// int nAlphaCount;
int nBgn;
// int nLoop;
// BOOL bDot = FALSE;
j = 0;
if( (pszBuf[j] >= 'a' && pszBuf[j] <= 'z')
|| (pszBuf[j] >= 'A' && pszBuf[j] <= 'Z')
|| (pszBuf[j] >= '0' && pszBuf[j] <= '9')
// || (pszBuf[j] == '.')
// || (pszBuf[j] == '-')
// || (pszBuf[j] == '_')
// || (pszBuf[j] == '=')
// || (pszBuf[j] == '%')
// || (pszBuf[j] == '$')
// )
){
j++;
}else{
return FALSE;
}
while( j < nBufLen - 2 &&
(
(pszBuf[j] >= 'a' && pszBuf[j] <= 'z')
|| (pszBuf[j] >= 'A' && pszBuf[j] <= 'Z')
|| (pszBuf[j] >= '0' && pszBuf[j] <= '9')
|| (pszBuf[j] == '.')
|| (pszBuf[j] == '-')
|| (pszBuf[j] == '_')
// || (pszBuf[j] == '=')
// || (pszBuf[j] == '%')
// || (pszBuf[j] == '$')
)
){
j++;
}
if( j == 0 || j >= nBufLen - 2 ){
return FALSE;
}
if( '@' != pszBuf[j] ){
return FALSE;
}
// nAtPos = j;
j++;
nDotCount = 0;
// nAlphaCount = 0;
while( 1 ){
nBgn = j;
while( j < nBufLen &&
(
(pszBuf[j] >= 'a' && pszBuf[j] <= 'z')
|| (pszBuf[j] >= 'A' && pszBuf[j] <= 'Z')
|| (pszBuf[j] >= '0' && pszBuf[j] <= '9')
// || (pszBuf[j] == '.')
|| (pszBuf[j] == '-')
|| (pszBuf[j] == '_')
// || (pszBuf[j] == '=')
// || (pszBuf[j] == '%')
// || (pszBuf[j] == '$')
)
){
j++;
}
if( 0 == j - nBgn ){
return FALSE;
}
if( '.' != pszBuf[j] ){
if( 0 == nDotCount ){
return FALSE;
}else{
break;
}
}else{
nDotCount++;
j++;
}
}
if( NULL != pnAddressLenfth ){
*pnAddressLenfth = j;
}
return TRUE;
}
//@@@ 2001.11.07 Start by MIK
//#ifdef COMPILE_COLOR_DIGIT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -