ホーム » 2011
年別アーカイブ: 2011
::StretchDIBits の戻り値が 0
ImageConverter::Stretch で ::StretchDIBits がうまく動作しない.
通常のダイアログとしての動作の時は問題なさそうだが,サイレントモードの場合 0 になる.
memDC->FillSolidRect(-1,-1,rect.Width()+2,rect.Height()+2,0x00ffffff) ; などは OK.
うまくいかない(0 になる)場合,ImageConverter::ResizeAB を利用(Image::Stretch)することにより対応.
これを調べていた時に,MemoryDC::Init で ::CreateDIBSection の呼び出しがうまくない?ことを見つけた.
戻り値や ppvBits はそれなりに入っているが,GetLastError では,8 が戻される.
0x00000008 ERROR_NOT_ENOUGH_MEMORY このコマンドを実行するのに十分な記憶域がありません。
詳しく調べてないが,以前 StretchDIBits などでうまくなかったのは,ここら辺が影響していたのかも知れない.
里親募集
ちょっと聞いたので,…
麻布大学動物応用科学科 動物トレーニング実習
里親募集中の犬の紹介
麻布大学応用動物心理学実習HP
ダイアログ.exe サイレントモード
ダイアログベースで,コマンドライン引数により何も表示しないで終了する exe
次の様なコードで,AfxWinMain でエラーになってしまう.
BOOL CReszPicApp::InitInstance()
{
…
CReszPicDlg dlg;
m_pMainWnd = &dlg;
if (_tcslen(m_lpCmdLine) != 0) {
dlg.EnumDIB() ;
dlg.ResizeDIB() ;
return FALSE ;
}
INT_PTR nResponse = dlg.DoModal();
…
}
—————————
Microsoft Visual C++
—————————
ハンドルされていない例外 は ReszPic.exe (MFC42D.DLL) にあります: 0xC0000005: Access Violation。
—————————
OK
—————————
WinMain.cpp
int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow)
{
…
// Perform specific initializations
if (!pThread->InitInstance()) {
if (pThread->m_pMainWnd != NULL) {
TRACE0(“Warning: Destroying non-NULL m_pMainWnd\n”);
pThread->m_pMainWnd->DestroyWindow();
}
nReturnCode = pThread->ExitInstance();
goto InitFailure;
}
…
}
m_pMainWnd への設定より前に,サイレントモードでの動作を行えば良い.
CReszPicDlg dlg;
// m_pMainWnd = &dlg;
if (_tcslen(m_lpCmdLine) != 0) {
dlg.EnumDIB() ;
dlg.ResizeDIB() ;
return FALSE ;
}
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
Message クラスなどで,AfxGetMainWnd()->GetSafeHwnd()==NULL の時の判断が抜けていたので修正.
AfxGetMainWnd()==NULL は多くの所で対応しているが,
AfxGetMainWnd()->GetSafeHwnd()==NULL は抜けがかなりありそう.
CView の OnFilePrint を抜き出し
OnFilePrint の関係を DH_Print クラスとして抜き出しました.
ダイアログベースの exe や,ビューの表示対象と異なるオブジェクトの印刷などに利用できると思います.
利用方法はこんな感じ.
class PrintTest : public DH_Print { public: virtual void OnPrint (CDC* pDC, CPrintInfo* pInfo) { CRect rect = pInfo->m_rectDraw ; { pDC->TextOut(0,0,_T("ここが印刷のためのコードです.")) ; } return ; } virtual BOOL OnPreparePrinting ( CPrintInfo* pInfo) { pInfo->SetMaxPage(5) ; return DoPreparePrinting(pInfo) ; } virtual CString GetDocumentTitle (void) { return _T("通常はドキュメント名を戻します.") ; } } ;
印刷が押されると,
void CAboutDlg::OnPrint() { PrintTest pt ; if (pt.OnFilePrint()) { OnOK() ; } }
2020/07/13 Google ドライブ上の Print.zip へのリンク
Print.zip
2020/12/17 公開しているファイルだけでは利用できなかったので修正
Print_2020_12.zip
クラス名 Print は DH_Print に変更.
印刷時のデフォルトのドキュメント名を ” DH_Print : %Y/%m/%d %H:%M:%S ” に変更.
DH_Print クラスを利用したサンプル.
PrtMF_2020_12.zip
DH_Print 利用のソースが zip の中にあり.
Virtual PC が遅い
昨日から Virtual PC と,ホスト間のアクセスが極端に遅くなった.
今までも,たまに,ファイルコピーなどで一時的に遅くなったことはあったが,ここまでではなかった様な...
エクスプローラで,左のフォルダツリーが表示されているとこれも遅い.
他の Virtual PC の共有フォルダの参照は,そこまでではないように感じるが...
動作は,電源 OFF などで LAN 上からいなくなった PC を参照した様な感じ.
全ての Virtual PC の終了で,今までは普通に戻っていたが今回は違うみたい.
ルータなども含め,LAN 上の全ての再起動が必要か?
それともホストにウィルス対策ソフト 2012 の体験版をインストールした影響か?
UNICODE
UNICODE 文字関係へのリンク
リコー ホーム > フォント > 過去のメルマガ >
第7号 JIS第3・第4水準
その中の 実際の文字種–>PDF
JIS第3水準漢字
JIS第3水準非漢字
JIS第4水準漢字
CodeZine
サロゲートペア入門
Microsoft JIS X 0213:2004 / Unicode 実装ガイド (PDF)
図書館員のコンピュータ基礎講座
文字コード
日本の文字コード
参考資料 > 文字コード
RegRead でのエラー
—————————
Windows Script Host
—————————
スクリプト: D:\Temp\MJobSel\Release.060\Script\20111114.wsf
行: 92
文字: 3
エラー: レジストリ キー “HKCU\Software\U–U–\M—\M—\FilePat_\User_Data” のルートが無効です。
コード: 80070002
ソース: WshShell.RegRead
—————————
OK
—————————
—————————
Windows Script Host
—————————
スクリプト: D:\Temp\MJobSel\Release.060\Script\20111114.wsf
行: 92
文字: 3
エラー: レジストリ キー “HKCU\Software\U–U–\M—\M—\FilePath\User_Dat_” を開いて読み取ることができません。
コード: 80070002
ソース: WshShell.RegRead
—————————
OK
—————————
どちらの場合も,キーの指定の間違い.
レジストリエディタでキーが開けなくなった場合の対応は,
レジストリ キーのオープンエラー
削除中にエラーが発生しました
セットアッププロジェクト
Envy100 その後
以前,MN128-SOHO-IB3 + MN-WLC54g でうまく接続できないでいたが,ATerm WR8500N では簡単に接続できた.
その代り? psc2550 がうまくつながらなくなり,有線に.
普通の印刷などはできるようになったが,Print Apps などは設定できてなかった.
HP カスタマー・ケア
└─ HP ENVY 100 オールインワンプリンター – D410a
└─ セットアップとインストールePrint & モバイル機器
└─ プリンターのアップデート
ログオン スクリーンセーバを無効に
[HKEY_USERS\.DEFAULT\Control Panel\Desktop]
“ScreenSaveActive”=”0”
LogonScreenSave.zip
Shell.Tile…
以前,デスクトップ上のウィンドウを操作したいことがあった.
ToggleDT.scf
[Shell]
Command=2
IconFile=explorer.exe,3
[Taskbar]
Command=ToggleDesktop
TileVert.vbs
Set objShell = CreateObject(“Shell.Application”)
objShell.TileVertically
TileHorz.vbs
Set objShell = CreateObject(“Shell.Application”)
objShell.TileHorizontally
CascadeW.vbs
Set objShell = CreateObject(“Shell.Application”)
objShell.CascadeWindows
//**************************************************************************************************
// ファイル名 :CtrlDskT.cxx
// 機能名 :デスクトップの制御
// 作成者 :
// 作成年月日 :’07/08/08
// 変更履歴 :
//**************************************************************************************************
//
#include <Afx.h>
#include "DelFileE.hxx"
#include "CharMFC.hxx"
#include "ShellExc.hxx"
#include "HelpAPI.hxx"
#include "CtrlDskT.hxx"
////
//*******************************************************************************
// 関数名 :デスクトップの表示
// 作成日 :’07/08/08
//*******************************************************************************
// http://support.microsoft.com/kb/190355/ja
// クイック起動バーに [デスクトップの表示] アイコンを再登録する方法
BOOL ControlDesktop::ToggleDesktop (void)
{
CString td_scf = ::GetTempPath()+_T("Command.tmp\\") + _T("ToggleDT.scf") ;
if (::FileIsNothing(td_scf)) {
// "デスクトップの表示.scf" の生成
::CreateEmptyFile(td_scf) ;
CString tdCmd ;
tdCmd += _T("[Shell]\r\n") ;
tdCmd += _T("Command=2\r\n") ;
tdCmd += _T("IconFile=explorer.exe,3\r\n") ;
tdCmd += _T("[Taskbar]\r\n") ;
tdCmd += _T("Command=ToggleDesktop\r\n") ;
::SaveText(td_scf,tdCmd) ;
}
ShellExec se ;
se.SetFile(td_scf) ;
se.Execute() ;
{ // 終了時に削除するように登録
static DelFileE dfe ;
dfe.Add(td_scf) ;
}
return TRUE ;
}
////
//*******************************************************************************
// 関数名 :重ねて表示,上下に並べて表示,左右に並べて表示
// 作成日 :’07/08/08
//*******************************************************************************
// http://www.microsoft.com/japan/technet/scriptcenter/resources/qanda/jul05/hey0726.mspx
// Hey, Scripting Guy! デスクトップ上にウィンドウを並べて表示する方法はありますか
#define CD_AW_CascadeW 0
#define CD_AW_TileHorz 1
#define CD_AW_TileVert 2
BOOL ControlDesktop::CascadeWindows (void) { return
ArrangeWindows(CD_AW_CascadeW) ; }
BOOL ControlDesktop::TileHorizontally(void) { return
ArrangeWindows(CD_AW_TileHorz) ; }
BOOL ControlDesktop::TileVertically (void) { return
ArrangeWindows(CD_AW_TileVert) ; }
BOOL ControlDesktop::ArrangeWindows (const long type)
{
CString cw_vbs = ::GetTempPath()+_T("Command.tmp\\") + _T("CascadeW.vbs") ;
CString th_vbs = ::GetTempPath()+_T("Command.tmp\\") + _T("TileHorz.vbs") ;
CString tv_vbs = ::GetTempPath()+_T("Command.tmp\\") + _T("TileVert.vbs") ;
CString cmdvbs ;
CString cmdExc ;
switch (type) {
case CD_AW_CascadeW : cmdvbs = cw_vbs ; cmdExc = _T("objShell.CascadeWindows \r\n") ; break ;
case CD_AW_TileHorz : cmdvbs = th_vbs ; cmdExc = _T("objShell.TileHorizontally \r\n") ; break ;
case CD_AW_TileVert : cmdvbs = tv_vbs ; cmdExc = _T("objShell.TileVertically \r\n") ; break ;
default : cmdvbs = cw_vbs ; cmdExc = _T("objShell.CascadeWindows \r\n") ; break ;
}
if (::FileIsNothing(cmdvbs)) {
::CreateEmptyFile(cmdvbs) ;
CString awCmd ;
awCmd += _T("Set objShell = CreateObject(\"Shell.Application\")\r\n") ;
awCmd += cmdExc ;
// objShell.TileHorizontally
// objShell.TileVertically
// objShell.CascadeWindows
::SaveText(cmdvbs,awCmd) ;
}
ShellExec se ;
se.SetFile(cmdvbs) ;
se.SetShowCmd(SW_HIDE) ;
se.Execute() ;
{ // 終了時に削除するように登録
static DelFileE dfe ;
dfe.Add(cmdvbs) ;
}
return TRUE ;
}
デスクトップ上にウィンドウを並べて表示する方法はありますか。
Shell.TileHorizontally method
Copy SrcFolder\*.txt DstFolder
あるフォルダの複数ファイルのコピーと移動.
Files_Copy_or_Move を直接利用するのではなく,FolderCopyFiles , FolderMoveFiles を利用します.
//*******************************************************************************
// 関数名 :あるフォルダ直下のファイルのコピーと移動
// 作成日 :’11/11/04
//*******************************************************************************
BOOL Files_Copy_or_Move (LPCTSTR src_Name,LPCTSTR dstPath,const BOOL isDelSrc,const BOOL exist)
{
CString srcPath = src_Name ;
CString srcName = _T(“*.*”) ;
if (CString(srcPath).IsEmpty()) { return FALSE ; }
if (!::FileIsDirectory(src_Name)) {
srcPath = ::GetFileDir (src_Name) ;
srcName = ::GetFileName (src_Name) ;
}
if (srcPath == dstPath) { return FALSE ; }
if (::FileIsNothing(srcPath)) { return FALSE ; } // 元のフォルダが存在しない
if (::FileIsNothing(dstPath)) {
if (!::CreateFolder(dstPath)) { return FALSE ; }
}
{
CStringArray srcFiles ;
::FolderEnumFiles(srcPath,&srcFiles,srcName) ;
for (int index=0 ; index<srcFiles.GetSize() ; index++) {
CString srcFPath = srcFiles[index] ;
CString srcFName = ::GetFileName(srcFPath) ;
CString newFName = ::FolderAddLastSP(dstPath) + srcFName ;
if (!::CopyFile(srcFPath,newFName,exist)) {
continue ;
}
if (isDelSrc) { // 元のファイルは削除? (移動の場合?)
CFile::Remove(srcFPath) ;
}
}
}
return TRUE ;
}
inline BOOL FolderCopyFiles (LPCTSTR srcName, LPCTSTR dstPath, const BOOL exist)
{ return Files_Copy_or_Move ( srcName, dstPath, FALSE, exist) ; }
inline BOOL FolderMoveFiles (LPCTSTR srcName, LPCTSTR dstPath, const BOOL exist=FALSE)
{ return Files_Copy_or_Move ( srcName, dstPath, TRUE, exist) ; }
GetLastError と FormatMessage
以前,以下を作成していた(Error.hxx)
inline CString Error::FormatMessage(const DWORD error) { CString message ; LPVOID lpMessageBuffer = NULL ; if (::FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL,error,MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT), (LPTSTR)&lpMessageBuffer,0,NULL)) { message = LPTSTR(lpMessageBuffer) ; ::LocalFree(lpMessageBuffer) ; } return message ; }
FindNoCase
同じ関数を作ってしまったので,...
CharFnc.hxx より
//*******************************************************************************
// 関数名 :大文字/小文字を区別せずに検索
// 作成日 :’11/09/07
//*******************************************************************************
inline
int FindNoCase (LPCTSTR str1,LPCTSTR str2)
{
CString fStr1 = str1 ;
int fIndex = fStr1.Find(str2) ;
if (fIndex >= 0) { return fIndex ; } // 大文字/小文字を区別して見つかった?
CString fStr2 = str2 ;
fStr1.MakeLower() ;
fStr2.MakeLower() ;
return fStr1.Find(fStr2) ; // 大文字/小文字を区別せずに(小文字にして)検索
}
他にも,
PathName.hxx
PathName.hxx
//*******************************************************************************
// 関数名 :ファイル拡張子取得(text.DAT->dat) 小文字で
// 作成日 :’11/06/09
//*******************************************************************************
inline
CString GetFileExtLow (LPCTSTR pathName)
{
CString ext = ::GetFileExt(pathName) ;
ext.MakeLower() ;
return ext ;
}
WDFME.exe
以前はここまでひどくなかったと思うが,昨日再起動をかけたにもかかわらず,物理メモリの空きが少なくなり動作が遅くなり始めた.
どうも WDFME.exe が影響しているようで,今日再起動後,また同様になってきた.
5 時間程度 PC を起動している状態で,2G 程度食っている.
WD SmartWare のアップデートが出ているのは知っていたが,特に支障は感じられなかった(1.5.0.18)ので更新しないでいた.
アップデートの 1.5.1.6 には以下の様な記述がある.
Fixed high memory utilization on certain systems.
更新してみたが効果なし.
今までうまく動作していて自分の環境に合っていたので,ちょっと残念.
ひとまずサービスを停止することにした.
BDH_Modify クラスを用意
BDH_Modify クラスを用意しました.
class BDH_Modify {
public:
BDH_Modify () { Modified = FALSE ; }
public:
virtual BOOL IsModified (void) const { return Modified ; }
virtual BOOL SetModifiedFlag (const BOOL mod=TRUE) { Modified = mod ; return TRUE ; }
virtual BOOL CanClose (void) { return SaveModified() ; }
public:
virtual CString GetPathName (void) const { return _T(“ファイル”) ; }
virtual BOOL DoFileSave (void) { return FALSE ; }
public:
virtual BOOL SaveModified (void) ;
protected:
BOOL Modified ;
} ;
inline
BOOL BDH_Modify::SaveModified (void)
{
if (!IsModified()) { return TRUE ; }
CString name = GetPathName() ;
if (name.Find(‘\\’) >= 0) {
name = ::GetFileName(name) ;
}
// VC98\MFC\SRC\DocCore.cpp CDocument::SaveModified() より
CString prompt ;
AfxFormatString1(prompt,AFX_IDP_ASK_TO_SAVE,name) ;
switch (AfxMessageBox(prompt,MB_YESNOCANCEL,AFX_IDP_ASK_TO_SAVE)) {
case IDCANCEL: return FALSE ; break ;
case IDYES : if (!DoFileSave()) { return FALSE ; } break ;
case IDNO : break ;
default : break ;
}
return TRUE ;
}
ダイアログベースなどで利用するために作成しました.
以下の様に利用しています.
#include “BDH_Mod.hxx”
class BDModCSV : public BDocCSV , public BDH_Modify {
public:
virtual BOOL Clear (void) { SetModifiedFlag(FALSE) ; return BDocCSV::Clear() ; }
public:
virtual void Serialize (CArchive& ar) { SetModifiedFlag(FALSE) ; BDocCSV::Serialize(ar) ; }
} ;
class Masters : public BDModCSV
{
// …
virtual CString GetPathName (void) const { return GetFilePath() ; }
virtual BOOL DoFileSave (void) { return FileWrite(GetFilePath()) ; }
} ;
BOOL Masters::AddMaster1 (Master* reg)
{
SetModifiedFlag(TRUE) ;
// …
}
void CEditCNDlg::OnCancel()
{
Masters* masters = Mast_S->GetSelected() ;
if (masters != NULL && !masters->CanClose()) { return ; }
CDialog::OnCancel();
}