Artifact Content

Not logged in

Artifact 9208018681295ced95701497f254f395454f22af


//--- K.I.LIB ---
// kl_wcmn.h : windows-common-interface operatin

#include "stdafx.h"
#include "kilib.h"

void kiSUtil::switchCurDirToExeDir()
{
	char exepath[MAX_PATH+50];
	GetModuleFileName( NULL, exepath, MAX_PATH );
	char* lastslash = 0;
	for( char* p=exepath; *p; p=CharNext(p) )
		if( *p=='\\' || *p=='/' )
			lastslash = p;
	if(lastslash)
		*lastslash = '\0';
	SetCurrentDirectory(exepath);
}

static int CALLBACK __ki__ofp( HWND w, UINT m, LPARAM l, LPARAM d )
{
	if( m==BFFM_INITIALIZED && d )
		::SendMessage( w, BFFM_SETSELECTION, TRUE, d );
	return 0;
}

bool kiSUtil::getFolderDlg( char* buf, HWND par, const char* title, const char* def )
{
	// 情報セット
	BROWSEINFO bi;
	ki_memzero( &bi, sizeof(bi) );
	bi.hwndOwner      = par;
	bi.pszDisplayName = buf;
	bi.lpszTitle      = title;
	bi.ulFlags        = BIF_RETURNONLYFSDIRS | BIF_DONTGOBELOWDOMAIN;
	bi.lpfn           = __ki__ofp;
	bi.lParam         = (long)def;

	// ダイアログ表示
	ITEMIDLIST* id = ::SHBrowseForFolder( &bi );
	if( id==NULL )
		return false;
	::SHGetPathFromIDList( id, buf );
	app()->shellFree( id );

	// 終了
	return true;
}

void kiSUtil::getFolderDlgOfEditBox( HWND wnd, HWND par, const char* title )
{
	char str[MAX_PATH];
	::SendMessage( wnd, WM_GETTEXT, MAX_PATH, (LPARAM)str );
	for( char* x=str,*l=str; *x; x=kiStr::next(x) )
		l=x;
	if( *l=='\\' || *l=='/' )
		*l='\0';
	if( getFolderDlg( str, par, title, str ) )
		::SendMessage( wnd, WM_SETTEXT, 0, (LPARAM)str );
}

int kiSUtil::getSysIcon( const char* ext )
{
	kiPath tmp( kiPath::Tmp );
	tmp += "noahicontest.";
	tmp += ext;

	SHFILEINFO fi;
	::SHGetFileInfo( tmp, 0, &fi, sizeof(fi), 
		SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX );
	return fi.iIcon;
}

void kiSUtil::msgLastError( const char* msg )
{
	char* pMsg;
	::FormatMessage( 
		FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,
		NULL,::GetLastError(),MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),(LPTSTR)&pMsg,0,NULL );
	if( msg )
		app()->msgBox( kiStr(msg) + "\r\n\r\n" + pMsg );
	else
		app()->msgBox( pMsg );
	::LocalFree( pMsg );
}

void kiSUtil::createShortCut( const kiPath& at, const char* name )
{
	::CoInitialize(NULL);

	IShellLink* psl;
	if( SUCCEEDED(::CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,IID_IShellLink,(void**)&psl)) )
	{
		psl->SetPath( kiPath(kiPath::Exe_name) );
		psl->SetWorkingDirectory( kiPath(kiPath::Exe,false) );

		IPersistFile* ppf;
		if( SUCCEEDED(psl->QueryInterface(IID_IPersistFile,(void**)&ppf)) )
		{
			wchar_t wsz[MAX_PATH]; 
			kiPath lnkfile( at );
			lnkfile += name, lnkfile += ".lnk";
			::MultiByteToWideChar(CP_ACP,0,lnkfile,-1,wsz,MAX_PATH);
			ppf->Save(wsz,TRUE);
			ppf->Release();
		}
		psl->Release();
	}
	::CoUninitialize();
}

bool kiSUtil::exist( const char* fname )
{
	return 0xffffffff != ::GetFileAttributes( fname );
}

bool kiSUtil::isdir( const char* fname )
{
	DWORD attr = ::GetFileAttributes( fname );
	return attr!=0xffffffff && (attr&FILE_ATTRIBUTE_DIRECTORY);
}