ホーム » メモ (ページ 17)

メモ」カテゴリーアーカイブ

2025年1月
 1234
567891011
12131415161718
19202122232425
262728293031  

カテゴリー

アーカイブ

ブログ統計情報

  • 103,449 アクセス


~iwao.n にアップしたものが動かない

//DevXP/Test/T_bxSldr/ を ~iwao.n/T_bxSldr にアップしたら動かない.
js の参照の関係とは思っていたが,少し時間がかかったのでメモ.
js を参照している部分のファイル名に大文字が混在していた.

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

WD Cloud を使ってみて…

いろいろなサイズのファイルのバックアップを取っていて,
VHD など大きなファイルのコピーで,ローカルの外付け HDD (USB 2 接続)より速そう.
それで簡単に計測してみた.
3 GB のファイルをコピー.
C , D は内蔵 HD .H は USB 2 接続.S は WSS .W は WD Cloud .

  MB/s
C->C 583 5
C->D 573 5
C->H 384 8
C->S 381 8
C->W 389 8
H->C 161 19
H->D 111 29
H->S 109 29
H->W 110 29
S->D 46 70
S->H 133 30
W->D 60 55
W->H 134 30

動作を見ていると,内蔵 HDD からの読込で最初のうちは速いがある所を過ぎると 5 MB/s 程度に落ちてしまう.
NAS から内蔵 HDD の時も同様.ファイルサイズが 500 MB 程度なら速いと思う.
上と同じ条件のすべてでは計測はしてないが,10 秒以内.


2015/10/29
ソースなどをバックアップしていて,
  時々,コピーが完了する前に何もなかったかの様に終わってしまう.
  プロジェクトのバックアップの時は,1 プロジェクトだけコピーして終わっていた.
  熱のせい?少し間を置くとコピーできる.すぐだと操作を間違えたかの様.

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

WD Cloud 追加

スマートフォンと PC のバックアップに使えそうだったので購入.


ユーザーマニュアルを見ながら進めていて,
セットアップアシスタントでの設定の最後の方でエラー?に.
メールアドレスの入力で何か間違えたみたい?
もう一度やり直そうとしても,「このドライブは既にセットアップ済みです」となる.
そのすぐ下のリンクをクリックしてもパスワードが入らず進められない.
結局は,「デバイスの設定に移動」で //wdcloud にアクセスする様になるが,この時のパスワードが違っていた.
「ユーザー」はいつものでパスワードもいつものを入れたつもりが,うまく登録されていなくて空の状態だった.
「ファイルに移動」の方は,上にも書いたが設定されてなかった.
ここでの入力は,メールアドレスとパスワードで,Web 経由の WD Cloud へのアクセスになるみたい.
最初から wdcloud にアクセスする方がわかりやすい様に感じた.


107SH と iPod touch に「WD Cloud モバイルアプリ」をインストール.
Android 版では思った様にバックアップできたが,iOS 版ではバックアップがうまくされてない.

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

Win 10 IE , Edge

Win 10 の IE や Edge からの User agent を調べていて,
Edge は “Edge/12.10240” が後ろの方にあるのでこれで判断できる.
  他に AppleWebKit Chrome Safari などが前にあるので,Edge と限定するためにはコードの変更(判断順の変更)が必要.
IE では “Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; Trident/8.0; .NET4.0C; .NET4.0E)” となっている.
  イントラネット環境で IE 11 とするには,「互換表示設定」の変更が必要.
  
  Mozilla/5.0 (Windows NT 10.0; Trident/7.0; rv:11.0) like Gecko
MSDN ユーザー エージェント文字列の変更


Win 10 での デスクトップ AP の実行で,
  ドロップダウン付のツールバーの表示がおかしくなる現象は,まだ残っているみたい.
  ただ,以前の様に簡単には現象を再現できない.

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

タスクトレイのチップが 64 …

XP 環境で,タスクトレイのチップが 64 文字で切れてしまっている.
VC8.exe は 64 で切られることはないが,VC 9 以降だとうまくない?
Win 7 環境での動作は問題ない.
まだ詳しく調べられてないが,とりあえずメモ.


2015/09/08
どうも _WIN32_WINNT によるみたい.

  Win UNICODE MBCS NOTIFYICONDATA
VC 6 400 152 88 szTip[64]
VC 7 501 936 488 dwInfoFlag
VC 8 502 936 488  
VC 9 600 956 508 hBallonIcon
VC10 601 956 508  
VC11 601 956 508  
VC12 601 956    

  Win は _WIN32_WINNT .
cbSize を NOTYFYICONDATA_V3_SIZE と指定すれば良いのか?
今回は,意図せず 64 文字で切れていたことを避けたかっただけなので,次の様に変更.
   NOTIFYICONDATA nid ; ::ZeroMemory(&nid,sizeof(NOTIFYICONDATA)) ;
   long maxLenTip = countof(nid.szTip)-1 ;
   #if (_MSC_VER >= 1500) // VC 9 ~
     if (::GetWindowsVersion() < 6) {
       maxLenTip = 64-1 ;
       }
   #endif
   if (::GetWindowsVersion() > maxLenTip) {
     …
     }

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

NotifyIcon クラスの使用

NotifyI.hxx


ダイアログまたは相当のクラスのヘッダに,NotifyIcon の変数を確保.
タスクトレイにアイコンを表示したい時は,NotifyIcon::Add または Mod を呼出す.
タスクトレイのアイコンを消したい時は,NotifyIcon::Del .


アニメーションの場合,NotifyIcon::StartAnimate とタイマで NotifyIcon::AnimateIcon .
アニメーションアイコンの登録は,NotifyIcon::AddIconA .登録されてない場合は,exe のアイコンと表示なしのトグル.
CAppDlg::OnInitDailog で StartAnimate ,CAppDlg::OnTimer で AnimateIcon だけで,exe アイコンが点滅する.


チップの設定は,NotifyIcon::SetTip .


最小化されたときに表示
  void CXxxxDlg::OnSize(UINT nType, int cx, int cy)
  {
    CDialog::OnSize(nType, cx, cy);
    ::FitWindow(this,&m_Image,0) ;
    if (nType == SIZE_MINIMIZED) {
      ShowWindow(SW_HIDE) ;
      NotifyI.Mod() ;
      }
    }


ヘッダとソースへの MESSAGE MAP の追加
  afx_msg LRESULT OnTrayCallback (WPARAM wParam,LPARAM lParam);
  ON_MESSAGE (WM_TRAY_CALLBACK, OnTrayCallback)
マウスのクリックによる動作
  LRESULT CXxxxDlg::OnTrayCallback (WPARAM wParam,LPARAM lParam)
  {
    UINT uID = (UINT)wParam;
    UINT uMouseMsg = (UINT)lParam;
    if (uMouseMsg == WM_LBUTTONDOWN) {
      AfxGetMainWnd()->ShowWindow(SW_SHOW) ;
      AfxGetMainWnd()->ShowWindow(SW_SHOWNORMAL) ;
      }
    if (uMouseMsg == WM_RBUTTONUP) {
      CPoint curPos ; ::GetCursorPos(&curPos) ;
      PopupMenu (NULL,IDR_POP_MENU,curPos,ID_XXXX) ;
      }
    return 0 ;
    }
WM_TRAY_CALLBACK は,NotifyI.hxx に定義済.


2015/09/03
メニュー表示後,デスクトップなどのクリックでメニューが消えなかったので検索すると,
SetForegroundWindow呼べば良いとのこと
    if (uMouseMsg == WM_RBUTTONUP) {
      CPoint curPos ; ::GetCursorPos(&curPos) ;
      SetForegroundWindow() ;
      PopupMenu (NULL,IDR_POP_MENU,curPos,ID_XXXX) ;
      }

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

Matrix クラスバグ

20 年位前に作成したコードのため,こんなガードが,…


行列の領域を作成する時に
   if ((long)r*(long)c*sizeof(double) > 1000000L) {
     return ;
     }
16 ビットの場合は 64000L .


ここのバナナのデータを開いた時,法線が正しく生成されず真っ黒になってしまった.

法線ベクトルのデータ数が 32068 で,1 MB を超えていた.
ガードを100 MB に変更.

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

メモリのオーバーフロー

次の様なコードで,実行時にエラー.
  i_DIB DIB_FlipVertical (const i_DIB& dib_)
  {
     i_DIB dib = dib_ ;
     if (dib_.GetWidth () == 0) { return dib ; }
     if (dib_.GetHeight() == 0) { return dib ; }
     u_32* bits = (u_32*)dib.GetP_Bits() ;
     for ( int y=0 ; y<dib.GetHeight()/2 ; y++) {
       for (int x=0 ; x<dib.GetWidth() ; x++) {
         u_32 sPos = x+dib.GetWidth()*( y) ;
         u_32 dPos = x+dib.GetWidth()*(dib.GetHeight()- y) ;
         u_32 tmp = *(bits+(dPos)) ;
         *(bits+(dPos)) = *(bits+(sPos)) ;
         *(bits+(sPos)) = tmp ;
         }
       }
     return dib ;
     }
原因は最初の dPos が画像の範囲を超えていること.これはすぐにわかったが,
デバッガで追いかけてもこのループは何もなかったかの様に通り,この関数を抜ける時にエラーとなる.
たまたまと言うこともあると思うが,MFC の配列を使用していればアクセスした段階で ASSERT されるのでは?
i_dib_f.hxx

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

error LNK2005 LNK2001

プロジェクト生成時に「MFC を使用しない」としたコンソール AP で Afx.h をインクルードした場合


リンク中…
nafxcwd.lib(afxmem.obj) : error LNK2005: “void * __cdecl operator new(unsigned int)” (??2@YAPAXI@Z) はすでに LIBCD.lib(new.obj) で定義されています
nafxcwd.lib(afxmem.obj) : error LNK2005: “void __cdecl operator delete(void *)” (??3@YAXPAX@Z) はすでに LIBCD.lib(dbgdel.obj) で定義されています

nafxcwd.lib(thrdcore.obj) : error LNK2001: 外部シンボル “__endthreadex” は未解決です
nafxcwd.lib(thrdcore.obj) : error LNK2001: 外部シンボル “__beginthreadex” は未解決です


プロジェクトの設定で「共有 DLL で MFC を使う」などに変更.

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

ファイル数

あるフォルダに,ユーザが作成した 3D データを,自動でファイル名を振って保存する様にしている.
但しファイル名の一部はユーザ指定.
ロジック上は,36^4 で 1,679,616 管理できるはず.
これがいっぱいになったと言われて…
  通常の運用であれば,1 日に 100 個はかなりきつい.
  それでも 16,000 日かかる.
そんなことがあり,ファイル名の空きを検出するツールを作成中.


かなり前の事だが,iRMX の FD のフォーマット?で,指定しないと 200 個位がデフォルトだったと記憶している.
NTFS ではその様なことはないと思ってたが,はっきりした情報があったのでメモ.
TechNet – ファイル システム

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

クリップボードに…

オフスクリーンにレンダリングしたものをクリップボードにコピーしていて,
  5000x5000x4 バイトの CF_BITMAP がうまく動作しない.
原因は Office クリップボードの制限みたいで 8 M まで.
  Office クリップボードにアイテムを追加できない場合の確認事項
無効にして対応.


よくわからないが,以下の様にした.
  CF_METAFILEPICT StretchDIBits
  CF_BITMAP     AlphaBlend
AlphaBlend function (Windows) – TechNet – Microsoft に,
  An error occurs (…) if the source device context identifies an enhanced metafile device context.
コピー画像は,


いろいろやっていて,一度 EMF に吐いて
 ::GetEnhMetaFile(…) で返される HENHMETAFILE を CF_ENHMETAFILE で意図した動作となった.
  {
    CString tmpPath = ::GetTempPath() ;
    tmpPath = CString(::Path_AddLastSP(tmpPath).c_str()) + _T(“Debug.tmp”) ;
    tmpPath = CString(::Path_AddLastSP(tmpPath).c_str()) + ::GetFileTitle(::GetModuleFileName()) ;
    CString nowStr = CTime::GetCurrentTime().Format(_T(“%d%H%M%S”)) ;
    CString tmpName = CString(::Path_AddLastSP(tmpPath).c_str()) + nowStr + _T(“.emf”) ;
    ::CreateFolder(tmpPath) ;
    ::ToEMF(dib,tmpName) ;
    HENHMETAFILE hMetaFile = ::GetEnhMetaFile(tmpName) ;
    return hMetaFile ;
    }
    …
   ::SetClipboardData(CF_ENHMETAFILE, hGMemEnhM) ;
i_DIB_x.hxx
i_DIB_Fn.hxx
i_dib.hxx


今度はメモリメタファイル(第 2 引数を NULL)にして,
  {
    CMetaFileDC mf_DC ;
    BOOL ret = mf_DC.CreateEnhanced(NULL,NULL,NULL,NULL) ;
    ::AlphaBlend (mf_DC.GetSafeHdc(),dRect,dib) ;
    HENHMETAFILE hEnhMetaF = mf_DC.CloseEnhanced() ;
    return hEnhMetaF ;
    }
  CreateEnhanced の幾つかの引数が NULL は知らなかった.
  CreateEnhMetaFile
  Programming Windows 5 18.2.2
  Programming Windows 5


XP 環境のクリップブックや,Word 2003 などでの CF_METAFILEPICT がうまくない.

  {
    CMetaFileDC mf_DC ;
    BOOL ret = mf_DC.Create() ;
    ::StretchDIBits (mf_DC.GetSafeHdc(),dRect,dib) ;
    HMETAFILE hMetaFile = mf_DC.Close() ;
    hGMemMeta = ::GlobalAlloc( GHND, (DWORD) sizeof(METAFILEPICT)) ;
    {
      LPMETAFILEPICT lpMFP = (LPMETAFILEPICT)GlobalLock(hGMemMeta) ;
      lpMFP->mm = MM_TEXT ;
      lpMFP->xExt = dRect.right ;
      lpMFP->yExt = dRect.bottom ;
      lpMFP->hMF = hMetaFile ;
      }
    ::GlobalUnlock(hGMemMeta) ;
    return hGMemMeta ;
    }
StretchDIBits とした.


i_ToDIB

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

Win 10 TP 10061

Build 10061 に更新.
VirtualBox だからなのかわからないが,OpenGL を利用している exe で真っ黒になってしまう.
Vista になった時,一部の環境やオフスクリーンの場合に同様の現象だったと記憶している.
DescribePixelFormat , SetPixelFormat 辺り?
Build 9926 では問題なかったと思う(9879 では問題ない).
exe によっては起動しなかったり,アプリケーションエラーになる.
他に,どこかの設定かわからないが,エクスプローラから AP にドキュメントのドロップが出来ない?


2015/06/03
Build 10130 で,OpenGL での描画が真っ黒になる動作は解消されている.

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

オフスクリーンのレンダリングで…

オフスクリーンのレンダリングで,環境により,真っ黒や意図しない色になってしまう現象があった.
オフスクリーン レンダリング
ウィンドウが最小化された後にその様になってしまうみたい.
描画対象のウィンドウを与えていてそれが空になっているのがうまくない.
::SetPixelFormat や ::MakeCurrent でエラーになっている.
IsRectEmpty() の時,描画部分を実行しない様に変更.

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

vsdrfCOM でエラー

VS 2005 のセットアッププロジェクトで,exe の「Register」を「vsdrfCOM」としてビルドすると,
—————————
AsTM0317.exe – アプリケーション エラー
—————————
“0x5cac9a9c” の命令が “0x0000005c” のメモリを参照しました。メモリが “read” になることはできませんでした。
プログラムを終了するには [OK] をクリックしてください
—————————
OK
—————————
 0x0000005c のメモリを参照しました
—— ビルド開始: プロジェクト: TestSet3, 構成: Debug ——
ファイル ‘C:\…\TestSet3\TestSet3\Debug\TestSet3.msi’ をビルドしています…
警告: ‘AsTM0317.exe’ というファイルのレジストリ情報を作成できません
警告: Windows インストーラは、どの選択された必須コンポーネントにも含まれていません。
ファイル ‘AsTM0317.exe’ をパッケージしています…
ファイル ‘AsImgCnv.exe’ をパッケージしています…
========== ビルド: 1 正常終了または最新の状態、0 失敗、0 スキップ ==========


AsImgCnv.exe の方はエラーの表示はない.
VS 2002 や 2008 では,OK.
また,vsdrfCOMSelfReg の場合も OK.


2015/03/20
vsdrfCOMSelfReg とした場合,そのままではインストール時にダイアログから表示されていた.
/RegServer , /UnRegServer が指定された場合,ダイアログを表示しない様に対応.
   BOOL isReg = FALSE ;
   {
     if (::FindNoCase(m_lpCmdLine,_T( “/REGSERVER”)) >= 0) { isReg = TRUE ; }
     else if (::FindNoCase(m_lpCmdLine,_T( “-REGSERVER”)) >= 0) { isReg = TRUE ; }
     else if (::FindNoCase(m_lpCmdLine,_T(“/UNREGSERVER”)) >= 0) { isReg = TRUE ; }
     else if (::FindNoCase(m_lpCmdLine,_T(“-UNREGSERVER”)) >= 0) { isReg = TRUE ; }
     }
   if (!isReg) {
     CAsImgCnvDlg dlg;
     m_pMainWnd = &dlg;
     int nResponse = dlg.DoModal();
     if (nResponse == IDOK) {
       }
     else if (nResponse == IDCANCEL) {
       }
     }

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

tstring Unit::ToName の呼び出し後エラー

もともと CString Unit::ToName(…) だった関数の戻り値を tstring に変更した.
利用している所の多くは,コンパイルエラーとなり Unit::ToName(…).c_str() と修正したが...
次の様な可変引数の修正が漏れていた.
CString unitStr ; unitStr.Format(_T(“%d_%s”),…,Unit::ToName(…)) ;

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

IIS 環境の再設定

2019/12 Win10 IIS 環境に Classic ASP のインストールと設定
2020/10 https://jml.mish.work/various/iis.html


AsTrmM_VC8 が動作しない.
—————————
Microsoft Visual C++ Runtime Library
—————————
Runtime Error!
Program: C:\Temp\…\Release.080\AsTM0129.exe
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application’s support team for more information.
—————————
OK
—————————
AsTrmM_VC6 は OK .
どうも OpenMP がうまくない?


S:\ …\PAto.exe にあると,
ASP 0177 Server.CreateObject に失敗しました 80070003


Win 7 で,Classic ASP は「World Wide Web サービス」-「アプリケーション開発機能」-「ASP」をチェック.
Win10 Classic ASP インストール
以前 XP に設定した時のメモ
Web ページの公開
WWW サービスの設定


2015/02/16
asp ファイルが存在する所を開くと,
  サーバー エラー
  500 – 内部サーバー エラーです。
  検索中のリソースに問題があるため、リソースを表示できません。
サーバ側で動かすと,
  An error occurred on the server when processing the URL. Please contact the system administrator.
  If you are the system administrator please click here to find out more about this error.
どうもデフォルトでは出力されなくなったみたい.


今度は次の様なコードで実行時エラー.
  dim oToPA
  set oToPA = Server.CreateObject(“PAto.AsXxx”)
  Microsoft VBScript 実行時エラー エラー ‘800a01ad’
  ActiveX コンポーネントはオブジェクトを作成できません。
  /Test/Test_1st/DrawVer.asp, 行 6
Win XP では ActiveX.exe を起動すれば良かったが,Win 7 では「管理者」とする必要があるので,
  「コマンドプロンプト」を「管理者として実行」して,その中で exe を起動.


アクセス権が許可されてないと,
  Server オブジェクト エラー ‘ASP 0178 : 80070005’
  Server.CreateObject アクセス エラー
  /Test/Test_1st/DrawVer.asp, 行 6
  許可を確認中に Server.CreateObject の呼び出しに失敗しました。
  このオブジェクトへのアクセスは拒否されます。
アクセス権を設定
Win 7 では IUSER
IUSER のアクセス権の設定


OS が 64 ビットの時,そのままでは ActiveX.dll が起動しない.
32 ビットアプリケーションの有効化


他の PC から,http://win7-iis:8080/ の様に接続できない(localhost:8080 は可能).
  対応方法がよくわからないが,ファイアウォールの設定で 8080 を追加してみたら通る様になった.
ファイアウォールの設定で 8080 を追加


2015/02/17
サーバのオートメーション機能で ini に設定値を保持しているが更新されない
(IUSER はフルコントロールとして存在している).
  Everyone の追加で意図した動作(ini を更新できる)にはなった.
タスクマネージャ オートメーション.exe の動作の表示

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

‘新しいテキスト ドキュメント.txt’ …

ちょっと変な状態に陥ったのでメモ.


\\DevS\Documents\MICS\Plan\MICSDat\Test_2015 01-03\9LM-2U-J6TRi-2S7M.001\
\\DevS\Documents\MICS\Plan\MICSDat\Test_2014_12\ などでは
[Window Title]
ファイルを作成できません
[Content]
ファイル ‘新しいテキスト ドキュメント.txt’ を作成できません。
開かれている共有ファイルが多すぎます。
[OK]


\\DevS\Documents\MICS\Plan\MICSDat\ だと戻ってこない(エクスプローラが応答なしになる)
\\DevS\Documents\MICS\Plan\ などでは正しく生成できる.


ログオフ時,\\DevS\Documents\MICS\Plan\MICSDat\新しいテキスト ドキュメント.txt ができていた.
再ログオン後,直後はできなかったがしばらくすると可能となった.


現象はどーってことない(再起動すれば直る)が,
問題は,MFC で作成した普通の AP でドキュメントが消失したこと.
その AP は,自動的に %Temp% にバックアップを保持するので完全に失ったわけではないが,
標準の MFC のシリアライズ動作ではうまくないのか?

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

コンソール AP でレジストリ読み取り

コンソール AP で,レジストリを読み取るために以下の様な関数を用意した.


  int Reg_GetInt (HKEY hKey,LPCTSTR subKey,LPCTSTR ent,const int defValue=0)
  {
     DWORD value = defValue ;
  #ifdef _ATL_VER
     {
       CRegKey reg ;
       reg.Open(hKey,subKey) ;
     #if (_ATL_VER >= 0x700)
       reg.QueryDWORDValue(ent,value) ;
     #else
       reg.QueryValue(value,ent) ;
     #endif
       }
  #else
     {
       HKEY hSecKey = NULL ;
       LONG openStatus = ::RegOpenKeyEx(hKey,subKey,0,KEY_READ,&hSecKey) ;
       if (hSecKey == NULL) { return value ; }
       DWORD type = REG_NONE ;
       DWORD count = sizeof(DWORD) ;
       LONG queryStatus = ::RegQueryValueEx(hSecKey,ent,NULL,&type,(LPBYTE)&value,&count) ;
       ::RegCloseKey(hSecKey) ;
       }
  #endif
     return int(value) ;
     }
*::Reg~ などのエラーチェックは省いている.
呼出すのはこんな感じ.
  int value = ::Reg_GetInt(HKEY_CURRENT_USER,_T(“Software\\Iwao\\Test\\RegAcc”),_T(“T_RegKey_DW”)) ;


CWinApp::GetProfileInt などが使えないかとやってみたが,…
1. AfxGetApp() を呼びだしても,NULL で戻ってくる.
  次の様に領域を確保.
    CWinApp theApp;
2. SetRegistryKey(key) が直接呼びだせないので,
  class C_SRK_WinApp : public CWinApp {
  public:
       void SetRegKey (LPCTSTR key) { SetRegistryKey(key) ; }
     } ;
  変数の確保は次の様に変更.
    C_SRK_WinApp theApp ;
3. SetRegistryKey の中で ASSERT(m_pszAppName != NULL)
  以下を追加して,CWinApp を初期化.
     AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0) ;
4. これで CWinApp::GetProfileInt は利用できるようになるが,CWinApp::m_pszProfileName が邪魔.
   C_SRK_WinApp* app = (C_SRK_WinApp*)AfxGetApp() ;
   int val = app->GetProfileInt(_T(“Test\\RegAcc”),_T(“T_RegKey_DW”),0) ;
  HKCU\Software\Iwao\(m_pszProfileName)\Test\RegAcc となってしまう.
5. m_pszProfileName を _T(“”) とすることにより,意図した値を取得できる様にはなった.
   C_SRK_WinApp* app = (C_SRK_WinApp*)AfxGetApp() ;
   if (app != NULL) {
     AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0) ;
     app->SetRegKey(_T(“Iwao”)) ;
     free((void*)app->m_pszProfileName) ;
     app->m_pszProfileName = _tcsdup(_T(“”)) ;
     int val = app->GetProfileInt(_T(“Test\\RegAcc”),_T(“T_RegKey_DW”),0) ;
     }


コンソール AP で CWinApp::GetProfileInt などを使うことは,やめ.

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

GetDIBits

GetDIBits を利用していて,最初うまく取れなかったのでメモ.


lpvBits に NULL が指定できるとのことなので,
  ::GetDIBits(hDC,hbm,0,bmap.bmHeight,NULL, &bmif,DIB_RGB_COLORS) ;
しかしうまく取れない.原因は,biSize の指定がされてなかったため.
  bmif.bmiHeader.biSize = sizeof(BITMAPINFOHEADER) ;


以下の様に,BITMAPINFO を求めてから,もう一度呼び出し情報は取れる様になった.
    ::GetDIBits(hDC,hbm,0,bmap.bmHeight,NULL, &bmif,DIB_RGB_COLORS) ;
  if (::GetDIBits(hDC,hbm,0,bmap.bmHeight,&bits[0], &bmif,DIB_RGB_COLORS) != 0) {
    ….
    }
が,bmif の部分を stack としていて,オーバーフローしている.
  BITMAPINFO bmif ; memset(&bmif, 0, sizeof(BITMAPINFO)) ;
デバッグ用に,次の様に 0xfe で初期化して渡してみると
  v_char bmif ; bmif.resize(sizeof(BITMAPINFO)+sizeof(RGBQUAD)*256,-2) ;
   memset(&bmif[0],0, sizeof(BITMAPINFO)) ;
  BITMAPINFO* pbmi = (BITMAPINFO*)&bmif[0] ;

00036C40  28 00 00 00 02 00 00 00 02 00 00 00 01 00 20 00  (............. .
00036C50  03 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00  ................
00036C60  00 00 00 00 00 00 00 00 00 00 FF 00 00 FF 00 00  ................
00036C70  FF 00 00 00 FE FE FE FE FE FE FE FE FE FE FE FE  ................


どうも,1 回目の GetDIBits で,pbmi->bmiHeader.biCompression が BI_BITFIELDS となっている.
  … the color table consists of three DWORD color masks that specify the red, … とある.
以下の様に,BI_RGB を再設定する様にした.
    ::GetDIBits(hDC,hbm,0,bmap.bmHeight,NULL, pbmi,DIB_RGB_COLORS) ;
    pbmi->bmiHeader.biCompression = BI_RGB ;
  if (::GetDIBits(hDC,hbm,0,bmap.bmHeight,&bits[0], pbmi,DIB_RGB_COLORS) != 0) {
    ….
    }
HBM_Fn.hxx
i_DIB_Fn.hxx

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

MessageBar クラスと OpenMP

新しい Message クラスを使用して,OpenMP 対応の動作のテスト.
void CTSttBView::OnTestDrawBar2()
{
  Message tmp ;
  ElapseTick et ;
  #define BAR_COUNT_2 1000000
  #ifdef _OPENMP
    #pragma omp parallel for
  #endif
  for (int i=0 ; i<100 ; i++) {
    Message bar ;
    bar.SetBar (_T(“Test Message 1 M * 100”),BAR_COUNT_2,RGB(0,255,0)) ;
    for (int index=0 ; index<BAR_COUNT_2 ; index++) {
      bar.SetBarInc() ;
      }
    }
  DWORD elapseT = et.GetElapse() ;
  CString str ; str.Format(_T(“%.2f 秒”),elapseT/1000.) ;
  AfxMessageBox(str) ;
  }
1 億回 SetBarInc を呼出していて,10 秒程度だったのが,#pragma omp parallel for で 20 秒程度になってしまった.


inline bool MessageBase::SetBarInc (void)
{
  if (GetBarMax() == 0) { return false ; }
  if (GetBarCount() < GetBarMax()) { B_Counter++ ; }
  else { B_Counter = 0 ; } // reset
  IncCounterR() ;
  {
    long lastPos = long(100*(GetBarCount()-1)/GetBarMax()) ;
    long new_Pos = long(100*(GetBarCount()-0)/GetBarMax()) ;
    if (lastPos == new_Pos) { return true ; }
    }
  #ifdef _WINDOWS
  #ifdef _MFC_VER
  #ifdef _OPENMP
    if (AfxGetMainWnd() == NULL) { return false ; }
  #endif
  #endif
  #endif
  return SetBarCount(B_Counter) ;
  }
AfxGetMainWnd() を呼出す回数を減らすことにより,3 秒程度に.

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