IwaoDev

この画面は、簡易表示です

2021 / 3月

MDI exe が動作しない?

Win10 Insider Preview 21H1 環境で,幾つかの exe がうまく動作しない.
引数が正しくありません。
VC 8 でビルドした exe は OK .VC 10 以降は NG のものがある.
SDI exe は大丈夫そうで,MDI exe はすべてではないが NG のものが多い.
タイミングとしては,3D データを読み込んだ後,ウィンドウに表示する前.


2021/07/12
一度「開く」ダイアログを表示するとその後はうまく動作する.


SDI exe であっても,VC 14 MFC スタティックだとうまくない?
MFC をスタティックリンクした exe でうまく動作しない
これはプロジェクトの設定がまずかったためで,別の記事に


2021/04/01
ちょっとわからないので,リモートデバッグの環境を作成することに.
MSDN Visual Studio での C++ プロジェクトのリモート デバッグ
リモートツールをダウンロードして,インストール.「スタート」から「Remote Debugger」を起動.
VS 2017 Remote Debugger
リモート側で exe を実行して,ホスト側で「アタッチ」.
VS でリモートのプロセスにアタッチ


2021/04/02
原因は,CRecentFileList::Add を通った時 ::CoInitinalize が呼び出されていないため.
CRecentFileList::Add  0x800401f0:CoInitialize は呼び出されていません
どうも MFC 10 から?変わったみたい.
MS C++ executable just started failing
MFC application crashing in ProcessShellCommand() when file to open specified on command line
それでも,なぜ環境によっては表面化しないのか?


CRecentFileList::Add で Win7 以降の「ジャンプリスト」に登録(::SHAddToRecentDocs )する様になった.
Win10 20H2 でも現象は発生した.2004 では問題ない.


対応としては InitInstance の最初に以下を追加.

	// OLE ライブラリを初期化します。
	if (!AfxOleInit()) {
		AfxMessageBox(_T("OLE の初期化に失敗しました。")) ;
		return	FALSE ;
		}

2021/04/06
2016/夏頃の Win10 で,その様になるものが存在したみたい.
その頃は T90Chi + VC 2015 + i3DV でやっていたと思うが,気づかなかった?

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。


VC コンソール AP にリソースの追加

先日作成したコンソール AP に,バージョン情報などを埋め込みたいと思い調べてみた.
検索すると次の所があった.
MSDN リソースを作成する (C++)


「Win32 コンソール アプリケーション」を「空のプロジェクト」として作成.
コードは,個人的な雛型 をコピーしてプロジェクトに登録.

#include	<clocale>
#include	<iostream>
#include	"i_define.hxx"

int	_tmain(int argc, TCHAR* argv[])
{
	_tsetlocale(LC_ALL, _T(""));
	{
		std::tout << _T("hello") << std::endl;
		}
	return	0;
	}

「ソリューション エクスプローラー」の「プロジェクト」を「右クリック」-「追加」-「新しい項目」.
VC 2013 リソースファイルの追加
「リソース ファイル (.rc)」を選択,ファイル名を指定して「追加」.
「リソース ビュー」に切り替わるので,ツリーの「~.rc」の所を「右クリック」して「リソースの追加」.
VC 2013 バージョンリソースの追加
必要に応じてアイコンなども追加.
ビルドすると exe に付加されている.
VC 2013 アイコンとバージョン情報をコンソール AP に付加


2022/08/01
バージョンリソースの読込み
FVersion.hxx

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。


QNAP NAS の Joomla! の設定

先日 Joomla! をインストール したので,その設定.
「システム」-「グローバル設定」-「サイト」-「SEO 設定」.
「システム」-「グローバル設定」-「サイト」-「SEO 設定」
また,htaccess.txt を .htaccess にコピーしないとうまく機能しない.
htaccess.txt を .htaccess にコピー
URL に ID が付加されない様にする設定.
URL から ID を削除
「Login Form」を無効に.
「Login Form」を無効に
「OSMap Free」のインストール.
「OSMap Free」のインストール
「J2XML」のインストール.
「J2XML」のインストール
「J2XML Options」-「Import」の設定.
「J2XML Options」-「Import」の設定

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。


C2084: 既に本体を持っています

共通のコードを hxx にまとめてビルドすると…

------ ビルド開始: プロジェクト: G3toM, 構成: Debug Win32 ------
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\VCTargets\Platforms\Win32\PlatformToolsets\v141_xp\Toolset.targets(39,5): warning MSB8051: Windows XP をターゲットとするサポートは非推奨であり、Visual Studio の将来のリリースで提供されなくなります。詳細については、https://go.microsoft.com/fwlink/?linkid=2023588 をご覧ください。
MainFrm.cpp
t:\develop\_.src\__win\c_fbx_to.hxx(23): error C2084: 関数 'bool exec_FBXtoG3(c_tstring &)' は既に本体を持っています。
t:\develop\_.src\__win\c_fbx_to.hxx(22): note: 'exec_FBXtoG3' の以前の定義を確認してください
t:\develop\_.src\__win\c_fbx_to.hxx(61): error C2084: 関数 'tstring call_fbx_to_ig3(c_tstring &)' は既に本体を持っています。
t:\develop\_.src\__win\c_fbx_to.hxx(60): note: 'call_fbx_to_ig3' の以前の定義を確認してください
t:\develop\_.src\__win\c_fbx_to.hxx(66): error C2065: 'exec_FBXtoG3': 定義されていない識別子です。
t:\develop\_.src\__win\c_fbx_to.hxx(74): error C2065: 'exec_FBXtoG3': 定義されていない識別子です。
\\z170s0\e_temp\test.prj\test\vc_test\tomb\g3tom\mainfrm.cpp(276): error C2065: 'call_fbx_to_ig3': 定義されていない識別子です。
\\z170s0\e_temp\test.prj\test\vc_test\tomb\g3tom\mainfrm.cpp(276): error C2440: '初期化中': 'tstring (__cdecl *)(c_tstring &)' から 'std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>' に変換できません。
\\z170s0\e_temp\test.prj\test\vc_test\tomb\g3tom\mainfrm.cpp(276): note: コンストラクターはソース型を持てません、またはコンストラクターのオーバーロードの解決があいまいです。
プロジェクト "G3toM141.vcxproj" のビルドが終了しました -- 失敗。
========== ビルド: 0 正常終了、1 失敗、1 更新不要、0 スキップ ==========

C2084: 関数 'bool exec_FBXtoG3(c_tstring &)' は既に本体を持っています。
「inline にしているのに…」と思ったが,
#pragma once がないため複数回読み込まれていた.

この投稿は役に立ちましたか? 役に立った 役に立たなかった 1 人中 0 人がこの 投稿 は役に立ったと言っています。

  • カテゴリー:

MFC 起動時のドキュメントの変更

ドキュメントのドロップ時のファイル名の変更 には対応したが,今度は起動時のドキュメントの変更.
InitInstance の所をデバッガで追いかけると,CWinApp::ProcessShellCommand の前後で対応できそう.
CWinApp::ProcessShellCommand
次の様に,対象のファイルを変更して起動できることは確認.

	CCommandLineInfo cmdInfo;
	ParseCommandLine(cmdInfo);
	{
		if (cmdInfo.m_nShellCommand == CCommandLineInfo::FileOpen) {
			cmdInfo.m_strFileName = ::Path_ChangeExt(cmdInfo.m_strFileName,_T("ig3")).c_str() ;
			}
		}
	if (!ProcessShellCommand(cmdInfo))
	//	...
この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。

  • カテゴリー:

SDI exe でファイルのドロップ

SDI exe でファイルをドロップされた時,関連する異なるファイルを開きたくなった.
次の様に,変換済みのデータが存在している時はそれを対象とする.
https://mish.myds.me/wordpress/dev/2021/03/03/win-prevent-2nd/


ドキュメントクラスの OnOpenDocument で変更するのは可能だが「MRU ファイル リスト」に残ってしまう.


15 年位前に,ブラウザからリンクをドロップして動作させるコードを書いた.
最近のブラウザでは,当時の様な操作はできないみたい.
WM_DROPFILES でリンクのテキストが取れたのだったと思う.
この時,何を参考にしてここにたどり着いたかは不明.
それを見ると CMainFrame::OnDropFiles にコードが書いてある.
デフォルトのコードとしては,CFrameWnd::OnDropFiles を呼出している.
CFrameWnd::OnDropFiles
::DragQueryFile でファイル名を取って CWinApp::OpenDocumentFile を呼出している.


CMainFrame::OnDropFiles でファイル名を取った後,処理を追加して CWinApp::OpenDocumentFile を呼べば良い.
手順としては (VC)\…\atlmfc\src\mfc\winfrm.cpp の CMainFrame::OnDropFiles をコピーして編集している.

void CMainFrame::OnDropFiles(HDROP hDropInfo) 
{
	SetActiveWindow();      // activate us first !
	CWinApp* pApp = AfxGetApp();
	ASSERT(pApp != NULL);
	v_tstring	files = ::DropFilesTo(hDropInfo) ;
	if (files.size() > 0) {
		tstring	file = files[0] ;
	//	ここで,必要に応じてファイル名を変更するなどの処理
		pApp->OpenDocumentFile(file.c_str()) ;
		}
	::DragFinish(hDropInfo);
//	CFrameWnd::OnDropFiles(hDropInfo);
	}

今回は SDI なのでこんな感じ.MDI であればループで回せば良い.

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。


C2679 右オペランドを扱う演算子…

あるプロジェクトに デバッグライト を追加してビルドすると

------ ビルド開始: プロジェクト:T_cmb_f, 構成:Release Win32 ------
  T_cmb_f.cpp
T_cmb_f.cpp(32): error C2679: 二項演算子 '<<': 型 'tstring' の右オペランドを扱う演算子が見つかりません (または変換できません)。
  C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\ostream(495): note: 'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(std::basic_streambuf<char,std::char_traits<char>> *)' の可能性があります
  C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\ostream(475): note: または 'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(const void *)'
  C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\ostream(455): note: または 'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(long double)'

C2679 右オペランドを扱う演算子が見つかりません
最近の VC はエラーの原因以外の情報がいっぱい表示されることがあるのでちょっとわかり難い.
「Unicode 文字セットを使用する」になっているのに std::cerr としていたため.
std::terr とすれば OK .
または,std::wcerr .

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。

  • カテゴリー:

エントリ ポイントが見つかりません

FBX SDK 2020.1.1 を使用したコンソール AP のプロジェクトを VC 11 でビルド.
「プラットフォームツールセット」は「Visual Studio 2012 – Windows XP (v110_xp)」.
「プラットフォームツールセット」-「Visual Studio 2012 - Windows XP (v110_xp)」
ビルドした exe を WinXP 環境で実行すると,
—————————
T_FBX.exe – エントリ ポイントが見つかりません
—————————
プロシージャ エントリ ポイント InterlockedCompareExchange64 がダイナミック リンク ライブラリ KERNEL32.dll から見つかりませんでした。
—————————
OK
—————————
InterlockedCompareExchange64 がダイナミック リンク ライブラリ KERNEL32.dll から見つかりませんでした。
Dependency Walker
VC 10 や VC 12 でビルドしたものは問題ない?
SDK のバージョンを変更して試してみると,
2019.0 までは OK で,2019.2 以降がうまくない.


他に VC 14 以降でビルドしたものがうまく動作しない.
何も表示されず exe が抜けて(終了して)しまったり,FBX の変換動作が機能しなかったりしている.
SDK 2020 では XP がサポートされていない.
https://help.autodesk.com/view/FBX/2020/ENU/
https://help.autodesk.com/view/FBX/2019/ENU/


FBX SDK とは直接関係ないが,
VC 14 以降のコンソール AP で,XP ではうまく実行できないものがある?
「プラットフォームツールセット」は「Visual Studio 2015 – Windows XP (v140_xp)」.
「標準 Windows ライブラリを使用する」とした exe は,起動はするがうまく実行できない.
「共有 DLL で MFC を使う」にすれば動作する.
「スタティック ライブラリで MFC を使用する」は未確認.


2020/03/16
VC 14 でビルドしたコンソール AP がうまく動作しなかったのは _stat .
何年か前に書いていた.WinXP で VC 14 _stat


vcredist_x86.exe を更新したからか,現象がちょっと変わってしまった.
全てではないが,先日通らなかったものが通る様になったものもある.
_stat で抜けてしまっていた exe が,うまく機能している?

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。

  • カテゴリー:

QNAP NAS に Joomla!

「AppCenter」で「Joomla」をインストール.表示されるバージョンは古いが,後で更新できる.
「AppCenter」で「Joomla」をインストール
「インストール」後「開く」.
サイト情報の設定.「サイト名」や「サイトの説明」は後からでも変更できる.
Joomla! サイト設定
データベース設定.ユーザ名とパスワードは「SQL サーバー」の設定 で指定したもの.
Joomla! データベースの設定
インストール内容の確認.
Joomla! インストール内容の確認
言語の追加インストール.
Joomla! 言語の追加インストール
言語パッケージの選択.
Joomla! 言語パッケージの選択
Japanese を指定.
Joomla! Japanese を指定
インストール完了.
Joomla! インストール
「installationディレクトリを削除」で「管理画面」などに入れるようになる.
Joomla! 管理画面のログイン
Joomla! を「今すぐアップデート」で更新.
Joomla! 「今すぐアップデート」
更新のインストール.
Joomla!  3.9.25 のインストール

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。


仮想マシンの XP が遅くなった?

今はもう誰も必要ないと思う情報.


先日 WinXP の VHD が入っている HDD が壊れて交換.
その時,ついでに PC のメモリも増設している.
壊れかけた HDD には不良セクタがあった様だが,対象の VHD は大丈夫だった.
デュプリケーターでコピーして,それなりに動作していると思う.


その後,仮想マシンの WinXP の動作が遅くなった?
全体的に遅いのではなく,メッセージボックスが出る時に数秒止まる様な感じ.
WinXP が遅くなった?


何が原因かしばらくわからなかった.
ホストのメモリに余裕がでたので,仮想マシンのメモリの割り当てを増やした.
この仮想マシンは 1.5G だったのを 3G に.
これがいけなかったみたいで,2G にすることで前の状態に戻ったと思われる
これは関係なかった.再起動による一時的な解消.
「仮想マシンの状態を保存」をすると解消される?


2021/03/14
遅くなるのは,音が出る時.使っているうちに音が再生されるまでのタイムラグが大きくなる.
使い勝手は良くないが,
VirtualBox の「仮想マシンの状態を保存」で解消できることを確認.
仮想マシンの状態を保存
「一時停止」では効果はない.

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。


QTS に入れない?

QNAP NAS の設定画面 QTS に入ろうとするが入れない.
QTS にログインできない
Q’center には入れて,見るとエラーになっている.
Q'center で「システムにアラートがあります」
昨日 15:20 位から異常になったと思われる.
Q'center システムの温度が正しくない
スマートフォンでの Qmanager でもエラーになっている.
Qmanager の「警告」
Qfile などは動作している.スクリーンショットは QNAP NAS に自動アップロードされたもの.


実は先日も一度発生している現象.その時は,更に HDD の片方も認識していない状態だった.
その時は,SSH 接続したコンソールから reboot して正常になった.
再起動する他の方法は,
* PC の Qfinder Pro で対象の NAS を「右クリック」-「再起動」.
* スマートフォンの Qmanager の「システムツール」-「システム」-「再起動」.
どちらもうまく動作しない.と思ったが…
QNAP NAS 再起動


ファームウェア 4.5.2.1566 の問題かもしれない.
更新版の 4.5.2.1594 があったので更新して様子見.
リリースノートには特に書かれていない?


LAN 2 を外さないとファームウェアの更新ができないのは相変わらず.


2021/03/16
今日もスマートフォンで警告が…
QTS には入れた.その時 /tmp の空き容量がないとのメッセージ.

C:\Users\Iwao\AppData\Local\Temp>ssh -l Iwao -p 22 ts253d
Warning: Permanently added the RSA host key for IP address 'fe80::265e:beff:fe40:316%15' to the list of known hosts.
Iwao@ts253d's password:
[Iwao@TS253D ~]$ df
Filesystem                Size      Used Available Use% Mounted on
none                    400.0M    291.4M    108.6M  73% /
devtmpfs                  3.8G      8.0K      3.8G   0% /dev
tmpfs                    64.0M     64.0M         0 100% /tmp
tmpfs                     3.8G    252.0K      3.8G   0% /dev/shm
tmpfs                    16.0M         0     16.0M   0% /share
/dev/mmcblk0p5            7.7M     46.0K      7.7M   1% /mnt/boot_config
tmpfs                    16.0M         0     16.0M   0% /mnt/snapshot/export
/dev/md9                493.5M    146.7M    346.7M  30% /mnt/HDA_ROOT
cgroup_root               3.8G         0      3.8G   0% /sys/fs/cgroup
/dev/mapper/cachedev1
                          3.5T      1.5T      2.0T  42% /share/CACHEDEV1_DATA
/dev/md13               417.0M    387.9M     29.1M  93% /mnt/ext
tmpfs                    48.0M    108.0K     47.9M   0% /share/CACHEDEV1_DATA/.samba/lock/msg.lock
df: /mnt/ext/opt/samba/private/msg.sock: Permission denied
tmpfs                    16.0M         0     16.0M   0% /share/NFSv=4
/dev/mapper/cachedev1
                          3.5T      1.5T      2.0T  42% /share/NFSv=4/Public
/dev/mapper/cachedev1
                          3.5T      1.5T      2.0T  42% /lib/modules/4.14.24-qnap/container-station
df: /share/CACHEDEV1_DATA/.qpkg/container-station/system-docker/overlay2/b3655c92c81974ab3428c03b4cd50a3692cdc6c90c5b1cc80b65b42d1d8fa77d/merged: Permission denied
df: /share/CACHEDEV1_DATA/.qpkg/container-station/system-docker/overlay2/753b9bed0bec605404d3cb39a2d60430575c8b0f32f23f818a4a8befdc0cb590/merged: Permission denied
/dev/mapper/cachedev1
                          3.5T      1.5T      2.0T  42% /share/CACHEDEV1_DATA/.qpkg/container-station/kernel-module/ubuntu-hd
/dev/mapper/cachedev1
                          3.5T      1.5T      2.0T  42% /lib/modules/4.14.24-qnap/container-station/ubuntu-hd
[Iwao@TS253D ~]$

確かに空いていない.
/tmp/httpdusr 以下(幾つかのコードでここを利用している)を開放することで正常に.
容量の割り当てが 64 M になっているが,どうしたものか.
[SOLVED]TS-251 : Increase size of /tmp


2021/04
NAS を定期的に再起動することで対応.
NAS の再起動などのスケージュール

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。


MBCS_Support_Deprecated_In_MFC

最初 VC 6 で作成したプロジェクト.VC 8 までは順にあげてあった.これをさらに VC 14.x まであげたもの.
その中の一部のプロジェクトを「マルチ バイト文字セットを使用する」に変更してビルドすると,

1>------ ビルド開始: プロジェクト:TEDHPro4, 構成:Debug Win32 ------
1>  StdAfx.cpp
1>c:\program files (x86)\microsoft visual studio 14.0\vc\atlmfc\include\afx.h(38): warning C4996: 'MBCS_Support_Deprecated_In_MFC': MBCS support in MFC is deprecated and may be removed in a future version of MFC.
1>  c:\program files (x86)\microsoft visual studio 14.0\vc\atlmfc\include\afx.h(33): note: 'MBCS_Support_Deprecated_In_MFC' の宣言を確認してください
1>  _WIN32_WINNT not defined. Defaulting to _WIN32_WINNT_MAXVER (see WinSDKVer.h)
1>  TEDHPro4.cpp
1>  TEDHProD.cpp
1>  コードを生成中...
1>StdAfx.obj : warning LNK4075: /EDITANDCONTINUE は /OPT:LBR の指定によって無視されます。
1>  TEDH4140.vcxproj -> c:\Temp\EDHProM\TEDHPro4\Debug.140\TEDHPro4.exe
1>  TEDH4140.vcxproj -> c:\Temp\EDHProM\TEDHPro4\Debug.140\TEDHPro4.pdb (Full PDB)
========== ビルド: 1 正常終了、0 失敗、4 更新不要、0 スキップ ==========

C4996: 'MBCS_Support_Deprecated_In_MFC'
今回のプロジェクトは,dll の単体テストのためのものなのでこのまま(warning が出る状態)とする.
これを回避するには「文字セット」を「Unicode 文字セットを使用する」にすること.
どうしても warning C4996 を消したいのではあれば,StdAfx.h で afx*.h のインクルードの前に NO_WARN_MBCS_MFC_DEPRECATION を定義すれば良い.
#define NO_WARN_MBCS_MFC_DEPRECATION
stdafx.h に #define NO_WARN_MBCS_MFC_DEPRECATION

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。


Win 環境で 2 重起動の禁止

ライブラリとして提供されている部分を,他のコードと分離するためコンソール AP(変換 exe)として作成.
テスト用にそれを呼出す部分も別のコンソール AP(呼出 exe)として作成.
変換 exe は,aaa.dat を aaa.txt の様に異なる形式に変換する機能.
呼出 exe は,::ShellExecute(…,”変換.exe aaa.dat”,…) の様に呼出し aaa.txt を処理する.
データにより変換(*.dat から *.txt へ)時間は数秒から数時間.
変換できたかどうかをチェックしている部分は次の様なコード.

for (size_t index=0 ; index<1000 ; index++) {
	::Sleep(100) ;
	if (::File_IsExist(g3d_name))	{	break ;		}
	}

データが悪いのか,ライブラリの問題なのかは不明たが,変換 exe の中でエラーになってしまうことがある.
エラーを軽減する方法はわかっているが,それでも完全ではない.
同じデータでも通る時とそうでないことがあり不安定.
そのため,変換後データが存在しない時に,変換中でなければ「変換 exe」を再起動させなければならない.


2021/03/09
ここまでの部分を単体のコードとして作成.
t_call.cpp
t_conv.cpp
T_mtex_2021_03_09.zip
変換 exe 呼出し 単体テスト
これらのコードでの問題は,
* 異常終了が判断できない.
* 変換に時間がかかる時,複数回呼んでしまう.


起動しているかどうかは Mutex を使えば良さそう.
変換 exe が起動している間,::CreateMutex (…,”入力ファイル名”) で作成したものを保持する.
呼出 exe のループでは,その Mutex が存在するかチェック.
なくなった時に,出力ファイルが存在している時はループを抜ける.
出力ファイルが存在していない時は,もう一度「変換 exe」を呼出す.


今まで作成の Mutex を使用したコード.
Prevent2.hxx Prevent2.cxx
ExclusS.hxx


t_conv.cpp

bool	test	(const tstring& name_in_)
{
	tstring	f_name = ::Path_GetName(name_in_) ; 
	HANDLE	hMutex = ::CreateMutex(NULL,FALSE,f_name.c_str()) ; 
	time_t	now = ::time(NULL) ;
	if ((now % 3) == 0) {
		::Sleep(3000) ;
		tstring	name_out = name_in_ + _T(".out") ;
		tstring	name_uni = ::Get_unique_name(name_out) ;
		::File_CreateEmpty(name_uni) ;
		}
	else {
		::Sleep(500) ;
		}
	::CloseHandle(hMutex) ; 
	return	true ;
	}

t_call.cpp

bool	t_call	(c_tstring& in_name_)
{
	tstring	name_in_ = in_name_ ;
	{
		tstring	f_name = ::Path_GetName(name_in_) ; 
		HANDLE	hMutex = ::CreateMutex(NULL,FALSE,f_name.c_str()) ; 
		DWORD	error  = ::GetLastError() ; 
		::CloseHandle(hMutex) ; 
		if (error == ERROR_ALREADY_EXISTS) { 
			return	true ; 
			} 
		}
	tstring	this_exe = ::i_GetModuleFileName() ;
	tstring	conv_exe = ::Path_AddLastSP(::Path_GetDir(this_exe)) + _T("t_conv.exe") ;
	    	name_in_ = ::QuotM_Add_Auto(name_in_) ;
	//	...
	//	変換 exe を起動
	//	...
	return	true ;
	}

Mutex で exe の起動を管理


2021/03/10 更にクラスに.W_mutex.hxx
次の様にできる.

bool	test	(const tstring& name_in_)
{
	W_mutex	mutex(::Path_GetName(name_in_).c_str()) ; 
	time_t	now = ::time(NULL) ;
	if ((now % 3) == 0) {
		::Sleep(3000) ;
		tstring	name_out = name_in_ + _T(".out") ;
		tstring	name_uni = ::Get_unique_name(name_out) ;
		::File_CreateEmpty(name_uni) ;
		}
	else {
		::Sleep(500) ;
		}
	return	true ;
	}

bool	t_call	(c_tstring& in_name_)
{
	tstring	name_in_ = in_name_ ;
	{
		W_mutex	mutex(::Path_GetName(name_in_).c_str()) ; 
		if (mutex.Is_exist())	{	return	true ;	} 
		}
	tstring	this_exe = ::i_GetModuleFileName() ;
	tstring	conv_exe = ::Path_AddLastSP(::Path_GetDir(this_exe)) + _T("t_conv.exe") ;
	    	name_in_ = ::QuotM_Add_Auto(name_in_) ;
	//	...
	return	true ;
	}

2021/12/01
W_mutex を利用した単体テスト用コード

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。



top