ホーム » 2011

年別アーカイブ: 2011

2024年12月
1234567
891011121314
15161718192021
22232425262728
293031  

カテゴリー

アーカイブ

ブログ統計情報

  • 100,738 アクセス


::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 などでうまくなかったのは,ここら辺が影響していたのかも知れない.

ImgCnvrt.hxx

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

里親募集

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

ダイアログ.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 は抜けがかなりありそう.

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

印刷ジョブの削除

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

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() ;
    }
  }

Print.zip
Print
マルチページ ドキュメント


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 クラスを利用したサンプル.
DH_Print クラスのサンプル EMF の印刷
PrtMF_2020_12.zip
DH_Print 利用のソースが zip の中にあり.

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

Virtual PC が遅い-その後

再起動を試したが,効果なし.
サーバのウィルス対策ソフトをアンインストールしたが,これも効果なし.

サーバからクライアントのファイルなどを参照する場合は以前と変わらないと思われる.
クライアント間も特に問題なし.
イベントビューアなどで,関連しそうなログは見つからない.

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

DDV を働かせたい

あまり DDV は使用しないが,数値で簡単な範囲チェックをやりたかった.
最大文字数などは指定しておけば勝手にやってくれるが,値のチェックはそうではない.

適当な(チェックしたい)タイミングで UpdateData(TRUE) を呼んでやればよい.
例えば,
void CXxxxDlg::OnChangeXxx() { UpdateData(TRUE) ; }
EN_UPDATE とどちらが良いかは不明.

本当は範囲を超えた時の入力をはじきたいが,それは簡単にはできなかった.

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

Virtual PC が遅い

昨日から Virtual PC と,ホスト間のアクセスが極端に遅くなった.
今までも,たまに,ファイルコピーなどで一時的に遅くなったことはあったが,ここまでではなかった様な...
エクスプローラで,左のフォルダツリーが表示されているとこれも遅い.
他の Virtual PC の共有フォルダの参照は,そこまでではないように感じるが...

動作は,電源 OFF などで LAN 上からいなくなった PC を参照した様な感じ.

全ての Virtual PC の終了で,今までは普通に戻っていたが今回は違うみたい.

ルータなども含め,LAN 上の全ての再起動が必要か?
それともホストにウィルス対策ソフト 2012 の体験版をインストールした影響か?

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

UNICODE

UNICODE 文字関係へのリンク


リコー ホーム > フォント > 過去のメルマガ > 
   第7号 JIS第3・第4水準
   その中の 実際の文字種–>PDF
    JIS第3水準漢字
    JIS第3水準非漢字
    JIS第4水準漢字
 
CodeZine
   サロゲートペア入門
 
Microsoft JIS X 0213:2004 / Unicode 実装ガイド (PDF)
 
図書館員のコンピュータ基礎講座
   文字コード
      日本の文字コード
         
   参考資料 > 文字コード
 
IME 2010 S-JIS

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

RegRead でのエラー

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
—————————


どちらの場合も,キーの指定の間違い.


レジストリエディタでキーが開けなくなった場合の対応は,
レジストリ キーのオープンエラー
削除中にエラーが発生しました

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

起動時のエラー

Point.hxx
VT が合っていない
include が間違っていて,VTABLE が合ってない.

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

セットアッププロジェクト

カスタム動作の追加
 「ソリューションエクスプローラ」で「右クリック」-「表示」-「カスタム動作」
 起動ポイントは, /Install /Commit /Rollback /Uninstall

カスタム動作の作成

MsgBox.exe では期待した動作となる.
動作として exe の終了を待つ様で,MakeCMF.exe の様な起動したままにするような動作には向かない.
試しに,MakeCMF.exe /Commit とすると,終了まで待ち,終了時にエラーとなる.
Setup Commit
その後,/Rollback が働き,インストールがキャンセルされる.

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

Envy100 その後

以前,MN128-SOHO-IB3 + MN-WLC54g でうまく接続できないでいたが,ATerm WR8500N では簡単に接続できた.
その代り? psc2550 がうまくつながらなくなり,有線に.


普通の印刷などはできるようになったが,Print Apps などは設定できてなかった.

HP カスタマー・ケア
 └─ HP ENVY 100 オールインワンプリンター – D410a
     └─ セットアップとインストールePrint & モバイル機器
         └─ プリンターのアップデート

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

ログオン スクリーンセーバを無効に

[HKEY_USERS\.DEFAULT\Control Panel\Desktop]
“ScreenSaveActive”=”0”
LogonScreenSave.zip

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

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

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

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

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

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 ;
	}
Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

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 ;
  }


StringFn.hxx

stringfn.hxx

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

WDFME.exe

以前はここまでひどくなかったと思うが,昨日再起動をかけたにもかかわらず,物理メモリの空きが少なくなり動作が遅くなり始めた.
どうも WDFME.exe が影響しているようで,今日再起動後,また同様になってきた.
5 時間程度 PC を起動している状態で,2G 程度食っている.
WD SmartWare のアップデートが出ているのは知っていたが,特に支障は感じられなかった(1.5.0.18)ので更新しないでいた.

アップデートの 1.5.1.6 には以下の様な記述がある.
Fixed high memory utilization on certain systems.

更新してみたが効果なし.

今までうまく動作していて自分の環境に合っていたので,ちょっと残念.
ひとまずサービスを停止することにした.

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

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();
  }

BDH_Modify クラス

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.