ホーム » Iwao の投稿 (ページ 2)

作者アーカイブ: Iwao

2024年10月
 12345
6789101112
13141516171819
20212223242526
2728293031  

カテゴリー

アーカイブ

ブログ統計情報

  • 96,055 アクセス


CXxxxDlg::OnCreate が 2 回

「ある操作を行ったとき exe が 2 つ起動する」と報告があった.
言い訳になるが,通常この動作は年に 2 回程度しか通らないもの.また,他の操作により通らないこともある.
その条件になる様に環境を設定して試すと,確かに…


その部分のコードは,何年も変更はしていない.
いろいろと動作を確認していると,VC 10 以前では問題ないが,11 以降で 2 つ起動することがわかった.


その動作の部分のみを抜き出して動作を試した.

int CT_DlG_1Dlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CDialog::OnCreate(lpCreateStruct) == -1)
		return -1;
	// TODO:  ここに特定な作成コードを追加してください。
	{
		HWND	HWnd = NULL ;
		{
			CWnd*	mainWnd = AfxGetMainWnd() ;
			if (mainWnd != NULL) {
				HWnd = mainWnd->GetSafeHwnd() ;
				}
			}
		HINSTANCE  hInst = ::ShellExecute(HWnd,NULL,_T("NotePad.exe"),NULL,NULL,SW_SHOWNORMAL) ;
		return	-1 ;
		}
	return 0;
	}

CXxxxDlg::OnCreate が 2 回呼ばれる?
MFC の動作が変わったのか,CXxxxDlg::OnCreate が 2 回呼ばれるようになったみたい.
https://itl.mish.work/i_Tools/Doc/blog/vc/TDlg0614.zip


2 回目に呼ばれた時は,何もしないで return -1 とする様に変更予定.

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

高 DPI 環境の CToolBar

複数のツールバーに対応するために CBitmap を new で生成する様に.
そのために新たに作成しようかと思ったが,既存のままでも良さそうなのでそれを少し修正.
LateDelete


また,次の様に予めボタンの背景を変更してみたが,うまくいかなかった.

{
	CDWordArray	orgBits ;
	DWORD		orgBmpSize = bm.bmWidthBytes * bm.bmHeight ;
	orgBits.SetSize(orgBmpSize) ;
	DWORD		orgBitsSize = tb_img.GetBitmapBits(orgBmpSize,orgBits.GetData()) ;
	for (DWORD index=0 ; index<orgBitsSize ; index++) {
		if (orgBits[index] == 0xc0c0c0) {
			orgBits[index] = col3D ;
			}
		}
	tb_img.SetBitmapBits(orgBitsSize,orgBits.GetData()) ;
	}

何かの手順が違っているみたいで,環境により?うまくいっている様に見えることもある.


https://itl.mish.work/i_Tools/Doc/blog/migrate/Test0611.zip

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

CToolBar ボタン画像

先日の内容で残っているのが,ボタン画像の背景の色.
リソースエディタで 0xC0C0C0 を指定している所が,ボタンの色(::GetSysColor(COLOR_3DFACE))にならない.
Toolbar  IDR_MAINFRAME
何年も前に作成したコードを見ると,0xC0C0C0 を COLOR_3DFACE に置き換えている部分がある.
それでMFC のコード afxtoolbarimages.cpp を眺めていると CMFCToolBarImages::TransparentBlt があった.
その中で ::TransparentBlt を呼出している.
先日のコードの次の部分を ::TransparentBlt に変更してテストすると,
dstDC.StretchBlt(0,0,imageSize.cx,imageSize.cy,&srcDC,0,0,org_size.cx,org_size.cy,SRCCOPY) ;
::TransparentBlt(dstDC.GetSafeHdc(),0,0,imageSize.cx,imageSize.cy,
       srcDC.GetSafeHdc(),0,0,org_size.cx,org_size.cy,0xC0C0C0) ;
::TransparentBlt  (...,0xC0C0C0)
0xC0C0C0 の部分が描画されていない(透明になっている)ことが確認できたので,
dstDC.FillSolidRect(0,0,imageSize.cx,imageSize.cy,0xf0f0f0) ;
::TransparentBlt(dstDC.GetSafeHdc(),…,0xC0C0C0) ;
FillSolidRect
	::TransparentBlt
::SetStretchBltMode(…,HALFTONE) が効かない?
仮の DC を用意して ::TransparentBlt(そのまま) してそれを ::StretchBlt(リサイズ) の様にしてもダメだった.
TransparentBlt HALFTONE で検索したがあまり有用な情報は引っ掛からなかった.
リサイズして転送する(StretchBlt)前に CBitmap::GetBitmapBits で取り出し 0xC0C0C0 を書き換えるしかないか?


https://itl.mish.work/i_Tools/Doc/blog/migrate/Test0610.zip

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

CToolBar ボタンのリサイズ

リサイズ部分を組み込んでみたが
CToolBar SetBitmap
ボタン画像の位置がズレている,DDB に対する操作が何か違っている.


試しに,新しいボタン画像サイズを次の様に求めるとそれなりの高さになった.
newImgSize.cy = newBtnSize.cy – 7 ;
newImgSize.cy = newBtnSize.cy - 7 ;
newImgSize.cx = newBtnSize.cx – 7 ;
newImgSize.cy = newBtnSize.cy – 6 ;
これでサイズは良さそう.
newImgSize.cx =(newBtnSize.cx - 7) * btnCount ;

{
	CSize	imageSize    = newImgSize ;
		imageSize.cx*= btnCount ;
	static	CBitmap	newImg ;	//  CBitmap* newImg = new CBitmap ; 
	{
		CBitmap	tb_img ;
		tb_img.LoadBitmap(idr) ;
		{
			BITMAP	bm = {0} ;  tb_img.GetBitmap(&bm) ;
			CSize	org_size = CSize(bm.bmWidth,bm.bmHeight) ;
			CDC*	wndDC = toolBar->GetDC() ;
			newImg.CreateCompatibleBitmap(wndDC,imageSize.cx,imageSize.cy) ;
			CDC	srcDC ;     srcDC.CreateCompatibleDC(wndDC) ;
			CDC	dstDC ;     dstDC.CreateCompatibleDC(wndDC) ;
			CBitmap*oldSrcBmp = srcDC.SelectObject(&tb_img) ;
			CBitmap*oldDstBmp = dstDC.SelectObject(&newImg) ;
			::SetStretchBltMode(dstDC.GetSafeHdc(),HALFTONE) ;
			dstDC.StretchBlt(0,0,imageSize.cx,imageSize.cy,
				&srcDC,0,0,org_size.cx,org_size.cy,SRCCOPY) ;
			srcDC.SelectObject(oldSrcBmp) ;
			dstDC.SelectObject(oldDstBmp) ;
			}
		}
	toolBar->SetBitmap(newImg) ;
	}

static CBitmap newImg としているため,複数のツールバーには対応していません.
CBitmap* newImg = new CBitmap の様にして終了時開放する必要があります.


https://itl.mish.work/i_Tools/Doc/blog/migrate/Test0607.zip

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

CBitmap のコピー

次の所を参考に CBitmap のリサイズ …
How do you scale a CBitmap object?
CBitmap のリサイズでうまくない
1 回はリサイズできているが,コピー動作の部分が違っているみたいで正しく表示できない.
検索してみたがあまりわかりやすいコードに引っ掛からなかった.
Copilot で問合わせると

// 元のビットマップ
CBitmap originalBitmap;

// ... (originalBitmap を適切に初期化)

// コピーするビットマップ
CBitmap copiedBitmap;

// 元のビットマップの情報を取得
BITMAP bitmapInfo;
originalBitmap.GetBitmap(&bitmapInfo);

// コピーするビットマップを作成
copiedBitmap.CreateBitmap(bitmapInfo.bmWidth, bitmapInfo.bmHeight, bitmapInfo.bmPlanes, bitmapInfo.bmBitsPixel, NULL);

// 元のビットマップのビットを取得
BYTE* pBits = new BYTE[bitmapInfo.bmWidthBytes * bitmapInfo.bmHeight];
originalBitmap.GetBitmapBits(bitmapInfo.bmWidthBytes * bitmapInfo.bmHeight, pBits);

// コピーするビットマップにビットを設定
copiedBitmap.SetBitmapBits(bitmapInfo.bmWidthBytes * bitmapInfo.bmHeight, pBits);

// メモリを解放
delete [] pBits;

関数として書き直し.

CBitmap*	Copy_CBitmap	(CBitmap* src)
{
	CBitmap*	dst = new CBitmap ;
	BITMAP	bm ;
	src->GetBitmap(&bm) ;
	dst->CreateBitmap(bm.bmWidth,bm.bmHeight,bm.bmPlanes,bm.bmBitsPixel,NULL) ;
	BYTE*	pBits = new	BYTE[bm.bmWidthBytes*bm.bmHeight] ;
	src->GetBitmapBits(bm.bmWidthBytes*bm.bmHeight,pBits) ;
	dst->SetBitmapBits(bm.bmWidthBytes*bm.bmHeight,pBits) ;
	delete[]	pBits ;
	return	dst ;
	}

何とかコピーを表示できた.
CBitmap のコピー
https://itl.mish.work/i_Tools/Doc/blog/migrate/T_CB0606.zip

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

mfc140ud.dll が見つからない …

「mfc140u.dll が見つからない…」の場合は
Microsoft Visual C++ 再頒布可能パッケージ


VC 2019 でデバッグビルドして実行すると,
—————————
Test.exe – システム エラー
—————————
mfc140ud.dll が見つからないため、コードの実行を続行できません。プログラムを再インストールすると、この問題が解決する可能性があります。
—————————
OK
—————————
VCRUNTIME140D.dll が見つからないため、コードの実行を続行できません。
ファイル名の所は MSVCP140D.dll などもある.
また exe は VC 2015 以降でデバッグビルドしたもの.


原因はわかっている.先日 VS 2022 のアップデートがあった.
その時 Win11 環境はうまくできたが Win10 環境では何故か失敗したため.
Microsoft.VisualCpp.Redist.14 をインストールできませんでした
どうしたものか…

「VS Installer」の「VS 2022」で「変更」を選択,そのまま進めるとダウンロード,インストールが始まった.
「VS Installer」の「VS 2022」で「変更」を選択
「修復」の方が良かったみたいだが …


「再起動が必要」の画面になり,その前にデバッグ版 exe を試すとうまく起動した.
「再起動が必要」

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

CBitmap の表示

ツールバーのビットマップをリサイズするために CBitmap を調べ始めた.
Inside VC++ Version 5 を参考に次の様に書いてみた.
プログラミング Visual C++ .NET では省かれている?

void CT_CBmpView::OnDraw(CDC* pDC)
{
//	CT_CBmpDoc* pDoc = GetDocument();
//	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	{
		CDC 	dc_mem ;	dc_mem.CreateCompatibleDC(pDC) ;
		CBitmap	bitmap ;	bitmap.LoadBitmap(IDR_MAINFRAME) ;
		BITMAP	bm = {0} ;	bitmap.GetBitmap(&bm) ;
		{
			CRect	rect(0,0,0,0) ;
			GetClientRect(&rect) ;
			rect.DeflateRect(100,100,200,200) ;
			::SetStretchBltMode(pDC->GetSafeHdc(),HALFTONE) ;
			dc_mem.SelectObject(&bitmap) ;
		//	pDC->BitBlt    (rect.left,rect.top,rect.right,rect.bottom,&dc_mem,0,0,SRCCOPY) ;
			pDC->StretchBlt(rect.left,rect.top,rect.right,rect.bottom,
				&dc_mem,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY) ;
			}
		}
	}

そのまま貼り付けてテスト可能な様に View の OnDraw に書いています.
これを参考に実装する場合,リソースの読込み部分などは OnInitialUpdate などで行ってください.
CBitmap によるビットマップリソースの表示
https://itl.mish.work/i_Tools/Doc/blog/migrate/T_CB0604.zip


欲しかった CBitmap のリサイズのコードは次の所にあった.
How do you scale a CBitmap object?

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

高 DPI 環境での CToolBar

vC 6 MFC プロジェクトを VC 2010 以降に更新すると,高 DPI 環境でツールバーがうまくない.
VC 10 以降でビルドした exe で,ツールバーが大きくならない
CMFCToolBar であれば OK .


個人的には 2005/06 に作成したコードを改良したものを使用している.
どこを参考にしたのかはちょっとわからない.
MFCによるWindows95プログラミング」や「INSIDE VISUAL C++ 5TH ED」などと思う.
それを簡単に利用できる様にできないかと…


コードは次の様な感じ.

BOOL	ToolBar__Resize	(CToolBar* toolBar,UINT idr)
{
	double	dpi_s = 1. ;
	{
		dpi_s = ::GetDPI_scale(toolBar->GetSafeHwnd()) ;	//  ::GetDpiForWindow() / 96.
		}
	if (dpi_s == 1.) {
		return	TRUE ;
		}
	CToolBarCtrl&	tbCtrl = toolBar->GetToolBarCtrl() ;
	CSize	btnSize(0,0) ;
	CRect	bdrRect(0,0,0,0) ;
	{	//  ボタンなどのサイズを取得
		DWORD	dwSize = tbCtrl.GetButtonSize() ;
		{
			btnSize.cx = LOWORD(dwSize) ;
			btnSize.cy = HIWORD(dwSize) ;
			}
		bdrRect        = toolBar->GetBorders() ;
		}
	CSize	newBtnSize = btnSize ;
	CRect	newBdrRect = bdrRect ;
	{	//  サイズを調整
		newBtnSize.cx    = int(btnSize.cx    *dpi_s) ;
		newBtnSize.cy    = int(btnSize.cy    *dpi_s) ;
		newBdrRect.left  = int(bdrRect.left  *dpi_s) ;
		newBdrRect.top   = int(bdrRect.top   *dpi_s) ;
		newBdrRect.right = int(bdrRect.right *dpi_s) ;
		newBdrRect.bottom= int(bdrRect.bottom*dpi_s) ;
		}
	{	//  サイズを指定
		tbCtrl.SetButtonSize(newBtnSize) ;
		toolBar->SetBorders(newBdrRect) ;
		}
	return	TRUE ;
	}

CToolBarCtrl  SetButtonSize
ツールバーボタンのビットマップのリサイズはまだ書換えができていない.
https://itl.mish.work/i_Tools/Doc/blog/migrate/Test0603.zip

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

VC6 から VC2019 への移行

今回は VC 6 ds? の VC 2019 への更新.
VS 2022 では,VC 6 からのアップグレードがなくなった


VS 2019 で dsw を開き 2019 に更新.
設定は VC 8 の時の手順とほとんど変わらない(設定値が微妙に異なる部分あり).
出力ディレクトリなどを「c:\Temp\…\$(ProjectName)\$(Configuration).142\」に.
VC 2019 出力ファイル
「文字セット」を「Unicode 文字セットを使用する」に.
VC 2019 文字セット
「プリコンパイル済み…」を「$(IntDir)$(TargetName).pch」に.
VC 2019  プリコンパイル済みヘッダ
「C/C++」の「出力ファイル」を「$(IntDir)」に.
VC 2019 C/C++ 出力ファイル
「リンカ」の「出力ファイル」を「$(OutDir)$(ProjectName).exe」に.
VC 2019 リンカ 出力ファイル
「ブラウザ情報」の「出力ファイル」を「$(OutDir)$(ProjectName).bsc」に.
VC 2019 ブラウザ情報 出力ファイル


そのままビルドすると,デバッグ版では D8016 エラーになる.
「C/C++」-「すべてのオプション」の「関数レベルでリンクする」をブランクに.
「関数レベルでリンクする」をブランクに


https://itl.mish.work/i_Tools/Doc/blog/migrate/Test0526.zip


2024/07/30
VC 6 から VC 2022 への移行


2024/08/21
VC 2010 などでも同じように指定することで移行が可能なことを確認.

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

Hyper Backup 設定

今日 Synology NAS のパッケージ MariaDB 10 の更新があった.
更新は他のパッケージと同様に行えばよい.
更新後ちょっと気になったのが「もし失敗したら?」ということ.
Hyper Backup でバックアップしておけば良さそうなので,その設定.


保存先として,ローカルディスクや USB ドライブも指定できるが,他社 NAS を対象とした.
Hyper Backup バックアップ先の選択


ASUSTOR NAS の設定は「サービス」-「Rsyncサーバー」にある.
ASUSTOR NAS Rsyncサーバー設定
「Rsyncサーバーを…」をチェックして「追加」で保存先を指定すれば良い.
モジュールの「名前」は,Hyper Backup の「バックアップモジュール」で指定する名称になる.


QNAP NAS は「HBS 3」-「Rsyncサーバー」にある.
QNAP NAS Rsyncサーバー設定
保存先の指定は特になさそうで「共有フォルダー」が「バックアップモジュール」で指定する名称になるみたい.


Hyper Backup の「バックアップ ウィザード」で「フォルダとパッケージ」を選択.
「ファイル サーバー」の「rsync」を選択して,今回は「単一バージョン」を選択.
バックアップ先の設定でサーバの IP やユーザー名などを設定して「次へ」.
Hyper Backup  バックアップ先の設定
今回「データ バックアップ」は特に指定しないで「次へ」.
「アプリケーション」にチェックをつけて「次へ」.
Hyper Backup  アプリケーションの指定
あとはそのまま受け入れてバックアップした.
バックアップされたデータは次の様になっている.
Hyper Backup のバックアップデータ

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

VC 6 プロジェクトの移行

今更の内容ではあるが,VC 6 プロジェクトを VC 8 などに移行する手順のまとめ.


私の場合,VC 6 からプロジェクトを作成して VC 2017 などでビルドした exe をリリースすることが多い.
他にも,コードの単体テストのためにコンソール AP を作成する時も VC 6 がお手軽.
Win11 でも MFC42*.dll などは入っているので,テストも exe をコピーすれば可能となる.
以前は VC 7 なども対象としていたが,関係するプロジェクトで必要がなくなり,今は使っていない.
また VC 7 形式を通すvcproj を直接編集しないといけない状態になることがある.
プロジェクトのバックアップをしやすい様に exe などの出力先は,別の所を指定している.


VC 6 で MDI プロジェクトとして作成.プロジェクト名はなるべく 5 文字以下にしている.
出力ディレクトリを変更.この時 VC のバージョンごとに出力先を分けている.
出力ディレクトリを変更

C:.
└─Test
    ├─Debug.060
    ├─Debug.080
    ├─Release.060
    └─Release.080

VC 8 で Test.dsw を開く.
文字セットを「Unicode 文字セットを使用する」に.
出力ディレクトリなどを「c:\Temp\…\$(ProjectName)\$(ConfigurationName).080」に.
VC 8 出力ディレクトリ
「プリコンパイル済み…」を「$(IntDir)/$(TargetName).pch」に.
プリコンパイル済みヘッダファイル
「C/C++」の「出力ファイル」を「$(IntDir)/」に.
C/C++  出力ファイル
「リンカ」の「出力ファイル」を「$(OutDir)/$(ProjectName).exe」に.
リンカ 出力ファイル
「プログラム データベース…」を「$(OutDir)/$(ProjectName).pdb」に.
プログラム データベース ファイルの生成
「ブラウザ情報」の「出力ファイル」を「$(OutDir)/$(ProjectName).bsc」に.
ブラウザ情報 出力ファイル
ツリーに「MIDL」が表示されている場合は「タイプライブラリ」を「$(IntDir)/$(ProjectName).tlb」に変更.
必要に応じて,それぞれの「コマンド ライン」で 060 のままの所がないか確認.


ビルドすると次のワーニングになる.

1>------ ビルド開始: プロジェクト: Test, 構成: Debug Win32 ------
1>コンパイルしています...
1>Test.cpp
1>o:\document\vc_test\migrate\test\test.cpp(61) : warning C4996: 'CWinApp::Enable3dControls': CWinApp::Enable3dControls is no longer needed. You should remove this call.
1>        c:\program files (x86)\microsoft visual studio 8\vc\atlmfc\include\afxwin.h(4477) : 'CWinApp::Enable3dControls' の宣言を確認してください。
1>リンクしています...
1>マニフェストを埋め込んでいます...
1>Test - エラー 0、警告 1
========== ビルド: 1 正常終了、0 失敗、0 更新、0 スキップ ==========

削除,または次の様に修正する.

#if(_MFC_VER >= 0x0700)
#else
#ifdef _AFXDLL
	Enable3dControls();		// 共有 DLL 内で MFC を使う場合はここをコールしてください。
#else
	Enable3dControlsStatic();	// MFC と静的にリンクする場合はここをコールしてください。
#endif
#endif

個人的によく変更する設定として
「C/C++」-「言語」-「OpenMP サポート」を「はい」に.
「リンカ」-「システム」-「大きい…アドレス」を「2GBを超える…サポートする」に.


Test.sln と Test.vcproj を Test_80.sln と Test_80.vcproj としてコピー.
Test_80.sln をエディタで開いて,Test_80.vcproj に.
sln ファイルを編集して ~_80.vcproj に


vC 9 以降に更新する場合は Test.sln を開く.
出力ディレクトリなどを「c:\Temp\…\$(ProjectName)\$(ConfigurationName).090」などに.
VC 9 出力ファイル
VC 8 の時と同様に
Test.sln と Test.vcproj を Test_90.sln と Test_90.vcproj としてコピー.
Test_90.sln をエディタで開いて,Test_90.vcproj に.


vcproj をエディタで開くと TypeLibraryName が c:\Temp\…\Test\Debug.060/Test.tlb として残っている.
そのままでも問題はなさそうだが,修正するとすれば $(IntDir)/$(ProjectName).tlb か.
https://itl.mish.work/i_Tools/Doc/blog/migrate/Test0520.zip


2024/07/26
VC 10 以降でビルドした MDI.exe で「引数が正しくありません。」となることがある.
対応方法は InitInstance に AfxOleInit() の呼出しを追加する.

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

「Windows 検索」設定

Windwos Search の「インデックスのオプション」を開きたいと問い合わせが入った.
「インデックスのオプション」


以前の Windows であれば「コントロールパネル」から入ると「インデックスのオプション」があった.
Win10 以降?は「コントロールパネル」も簡単には開けない.


Windows の検索ボックスで “インデックスのオプション” と入力すれば良かったのだが…
それが思い出せず,”Windows サーチ” や “Windows 検索” と入力して,うまくたどり着けない.
“Windows Search” と入力しないとうまくないみたい.
Wiidows 検索ボックス 「Windows Search」
「Windows 検索」の「クラッシック」の下の「…検索場所をカスタマイズ…」を選ぶと表示できる.


Windows の設定などは,キーワードを英語で入力する方が良いのかもしれない.


2024/06/19
「スタート」で表示される「検索ボックス」に何か入力すると「…」(オプション メニュー)が表示される.
それを選択すると「インデックス オプション」などがある.
「検索ボックス」-「...」(オプション)


2024/06/20
「インデックス オプション」は次の様なコマンドでも可能なので,::ShellExecute で呼び出す様にした.
control.exe /name Microsoft.IndexingOptions

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

3MF データが開けない?

3D データを 3MF 出力したものが開けなくなったと問い合わせが入った.
3MF が開けない  0x80004003
開発環境では現象がなかなか確認できなかったが,自前の iZIP.exe 版の影響とわかった.
Shell の ZIP 機能を使用していた 2022/12 いっぱいぐらいはうまく動作する.
.net を使用した iZIP.exe にしてからの 3MF がうまく開けない


自前で作成している 3D ビューアなどではうまく開ける.
それぞれの 3MF を展開して,テキストエディタなどで比較しても特に違いはない.
また 3MF をバイナリで比較すると,少し異なる所があることはわかる.


まだはっきりしていないが,バイナリを見た限りではディレクトリ区切りの影響か?


2024/05/16
iZIP.exe が影響していることはわかったが,その違いがなかなかわからなかった.
iZIP.exe を起動して 3MF を展開したイメージのフォルダをドロップして確認.
3MF を展開した(ZIP 圧縮前の)データ
iZIP.exe をビルドしている VC が 2022 でないとうまくないみたい.


関連しそうなのは次の情報か?
軽減策:ZipArchiveEntry.FullName パスの区切り文字
.NET Framework 4.6.x への移行に関する変更の再ターゲット


試しに ZipFile::CreateFromDirectory に渡すファイル名を ‘/’ にしてみたが,効果はなかった.
ZipFile::CreateFromDirectory  '/'

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

ASUSTOR NAS が開けない?

たまに発生する現象.
ASUSTOR NAS の Web サーバにアクセスできなくなる.
ASUSTOR NAS AS5202T にアクセスできなくなった


今までは NAS を再起動して対応していた.が,今回は違う方法で…
ADM に入って「Web Center」を起動.
「Webサーバー」の「80」と「443」にあたる部分のチェックを一度外して「適用」.
ASUSTOR NAS Web Center  Webサーバー  80 443 OFF
もう一度チェックを付けて「適用」.
この操作で Web サーバの再起動ができるみたい.

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

error C2272

次の様なコードで static にしようとすると,

class	RegPatNo	:	public	iDocCSV	{
//	...
public:
/*	static	*/	tstring		GetPathRPC	(void)	const ;
	} ;

inline	tstring	RegPatNo::GetPathRPC	(void)	const
{

	tstring	tmp_path = ::Get_i_Tools_tmp_date() ;
	::Folder_Create(tmp_path) ;
	tstring	rpc_name = ::Path_AddLastSP(tmp_path) + FN_RP_csv ;
	return	rpc_name ;
	}
--------------------Configuration: T_CSV_ - Win32 Debug--------------------
Compiling...
T_CSV_.cpp
t:\develop\_.src\test\regpatno.hpp(101) : error C2272: 'GetPathRPC' : modifiers not allowed on static member functions
Error executing cl.exe.

T_CSV_.exe - 1 error(s), 0 warning(s)

error C2272  : modifiers not allowed on static member functions
次の様に const の指定を外さなければならない.
static tstring GetPathRPC (void) ;
const の指定を外す

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

DSM 7 upload_max_filesize

WebGL データのアップロードのテストなどで,大きなデータが増えてきた.
https://itl.mish.work/i_Tools/to_wgl/
今までは 32 MB で,アップロードのコードでもその制限を加えていた.その制限を 64 MB に.


NAS によっては .htaccess や php.ini で指定するが,Synology NAS では .htaccess はエラーになる.
「Web Station」で「プロファイル」を選択,「編集」-「コア」タブで設定できる.
Synology NAS upload_max_filesize
memory_limit は「128M」になっているのでこれはそのまま.
post_max_size と upload_max_filesize を「64M」に変更.

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

DirectoryNotFoundException

以前作成した .NET の ZipFile クラス使用した exe
この iZIP.exe で System.IO.DirectoryNotFoundException .


原因は,ある環境でユーザ名に半角スペースが含まれていた.
ユーザ名に半角スペースを含む環境を作成して ZipFold.exe で同じ様な操作を行ったが,再現できない.
いろいろと調べていると,iZIP.exe に渡す時の入力のフォルダ名に半角スペースが含まれていると現象が発生する.

C:\Users\Iwao\AppData\Local\Temp\i_Tools.tmp\test>Q:\C_Temp\i_Tools\ZIP\iZIP\Release.140\iZIP.exe a "C:\Users\Iwao\AppData\Local\Temp\Send.tmp\20240416\09 22 39\" abc.zip

ハンドルされていない例外: System.IO.DirectoryNotFoundException: パス 'C:\Users\Iwao\AppData\Local\Temp\i_Tools.tmp\zip_CLI\20240416\154459\a' の一部が見つかりませんでした。
   場所 System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   場所 System.IO.FileSystemEnumerableIterator`1.CommonInit()
   場所 System.IO.FileSystemEnumerableIterator`1..ctor(String path, String originalUserPath, String searchPattern, SearchOption searchOption, SearchResultHandler`1 resultHandler, Boolean checkHost)
   場所 System.IO.DirectoryInfo.EnumerateFileSystemInfos(String searchPattern, SearchOption searchOption)
   場所 System.IO.Compression.ZipFile.DoCreateFromDirectory(String sourceDirectoryName, String destinationArchiveFileName, Nullable`1 compressionLevel, Boolean includeBaseDirectory, Encoding entryNameEncoding)
   場所 ZipFile_create(Char* fld_file, Char* zip_name) 場所 c:\program files (x86)\microsoft visual studio 14.0\vc\include\xstring:行 1017
   場所 zip_create(basic_string<wchar_t\,std::char_traits<wchar_t>\,std::allocator<wchar_t> >* , Char* zip_root) 場所 t:\develop\_.src\__mlt_\zip_func.hxx:行 47
   場所 zip_create(Char* fld_file, Char* zip_name) 場所 t:\develop\_.src\__mlt_\zip_func.hxx:行 143
   場所 call_func(Int32 argc, Char** argv) 場所 c:\program files (x86)\microsoft visual studio 14.0\vc\include\xstring:行 521
   場所 wmain(Int32 argc, Char** argv) 場所 l:\document\develop\tools\_free\ziptools\izip\izip.cpp:行 168
   場所 _wmainCRTStartup()

C:\Users\Iwao\AppData\Local\Temp\i_Tools.tmp\test>Q:\C_Temp\i_Tools\ZIP\iZIP\Release.140\iZIP.exe a "C:\Users\Iwao\AppData\Local\Temp\Send.tmp\20240416\09 22 39\" ".\20240416\1545\abc.zip"

ハンドルされていない例外: System.IO.DirectoryNotFoundException: パス 'C:\Users\Iwao\AppData\Local\Temp\i_Tools.tmp\zip_CLI\20240416\154602\a' の一部が見つかりませんでした。
   場所 System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   場所 System.IO.FileSystemEnumerableIterator`1.CommonInit()
   場所 System.IO.FileSystemEnumerableIterator`1..ctor(String path, String originalUserPath, String searchPattern, SearchOption searchOption, SearchResultHandler`1 resultHandler, Boolean checkHost)
   場所 System.IO.DirectoryInfo.EnumerateFileSystemInfos(String searchPattern, SearchOption searchOption)
   場所 System.IO.Compression.ZipFile.DoCreateFromDirectory(String sourceDirectoryName, String destinationArchiveFileName, Nullable`1 compressionLevel, Boolean includeBaseDirectory, Encoding entryNameEncoding)
   場所 ZipFile_create(Char* fld_file, Char* zip_name) 場所 c:\program files (x86)\microsoft visual studio 14.0\vc\include\xstring:行 1017
   場所 zip_create(basic_string<wchar_t\,std::char_traits<wchar_t>\,std::allocator<wchar_t> >* , Char* zip_root) 場所 t:\develop\_.src\__mlt_\zip_func.hxx:行 47
   場所 zip_create(Char* fld_file, Char* zip_name) 場所 t:\develop\_.src\__mlt_\zip_func.hxx:行 143
   場所 call_func(Int32 argc, Char** argv) 場所 c:\program files (x86)\microsoft visual studio 14.0\vc\include\xstring:行 521
   場所 wmain(Int32 argc, Char** argv) 場所 l:\document\develop\tools\_free\ziptools\izip\izip.cpp:行 168
   場所 _wmainCRTStartup()

C:\Users\Iwao\AppData\Local\Temp\i_Tools.tmp\test>

iZIP.exe  System.IO.DirectoryNotFoundException
入力のフォルダ名の “…\20240416\09 22 39\” の “09 22 39” 直後の ‘\’ を削除するとうまくいく.


デバッガで iZIP.exe に渡されるコマンドラインを確認.
iZIP.exe コマンドライン引数
デバッグ時,ダンプする様にコードを書換え.
iZIP.exe コマンドライン引数のダンプ
やはり argv がうまく解釈されていない.
argv[2]が「…\17 53 06″ c:\…」となってしまっている.
“…\17 53 06\\” の様にすれば通ることは確認できた.
perse_commandline では ‘\”‘ がダブルクォーテーションと解釈され,’\\’ はバックスラッシュ?


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

「引数が正しくありません」

以前に書いた情報を整理.
Win10 21H1 でうまく動作しない exe
Win10 環境で,MDI exe にドキュメントをドロップすると「引数が正しくありません」となることがある.


原因は ::CoInitinalize が呼び出されていないため.
コードでの対応方法としては InitInstance の最初に以下を追加.

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

また,一度「開く」ダイアログを表示すると,その後は問題ない.

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

SSL 証明書の更新ができない?

以前から安定しない気がする証明書の更新
うまく更新できることも多くなったとは思うが,手動で行うとうまくないことがある.
ASUSTOR NAS  Let's Encrypt
今までは,ルータの「ポートフォワーディング」で 80 を対象の NAS に変更して対応できていた.
それが,今日はうまくいかない.
外から http://27.92.169.109 にアクセスすると,別の Web サーバのままで,対象の NAS に転送されない.


ルータを再起動することで,うまく転送され,証明書の更新もできた.


2024/06/08
DS220+ と TS253D はちゃんと更新されている.
AS5202T はポートフォワーディングの設定で 80 を変更して取得.
今回 DS116 はなぜかうまく取得できない.
更新できた証明書は DS220+ などにインポートした.

2024/06/09
日を改めて DS116 もうまく更新できた.

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

VirusTotal Trojan 472047

最近 ViruaTotal で,VC 2022 ビルドの exe が引っ掛かる様になった気がする.

Antiy-AVL          GrayWare/Win32.Wacapew
Arcabit            Trojan.Lazy.D733EF [many]
BitDefender        Gen:Variant.Lazy.472047
Emsisoft           Gen:Variant.Lazy.472047 (B)
GData              Gen:Variant.Lazy.474792
MAX                Malware (ai Score=87)
MaxSecure          Trojan.Malware.121218.susgen
McAfee             GenericRXWN-PP!71DE1C7042EF
Rising             Trojan.Generic@AI.83 (RDML:km3T2NBP/pqn91WCd2xwaA)
Skyhigh (SWG)      GenericRXWN-PP!71DE1C7042EF
Trellix (FireEye)  Gen:Variant.Lazy.472047
VIPRE              Gen:Variant.Lazy.472047

VirusTotal   Trojan  472014
VC 2015 や 2017 でビルドしたものはほぼ大丈夫だが,2019 や 2022 ではうまくない.
また,以前は検出されなかったものが,引っ掛かる様になったものもある.
誤検知と思われるが,どうしたものか…

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