ホーム » Windows (ページ 7)

Windows」カテゴリーアーカイブ

2025年7月
 12345
6789101112
13141516171819
20212223242526
2728293031  

カテゴリー

アーカイブ

ブログ統計情報

  • 118,043 アクセス




引数が正しくありません。

自分で作成した AP のテストをしていて,「引数が正しくありません。」.
20 年位前から変更していないコードのバグだった.


かなりイレギュラーな操作をしない限り,現象は発生しない.
実際の操作としては,データの挿入場所を指定しないで,強制的に「確定」した場合.
またその操作の前にある手順やデータが影響する.


表示されるメッセージは,MFC のバージョンにより異なる.
また,Windows API 内でこのメッセージが表示されることもある みたい.
AfxThrowInvalidArgException VC 8  無効な引数が発生しました。
AfxThrowInvalidArgException VC 10  引数が正しくありません。


今回のものは,配列に対して,確保されている領域を超えてアクセスしたことが原因.
VC 2017 でデバッグ AfxThrowInvalidArgException


アクセスする前に,要素数が満たしているかのチェックをすることで回避できる.
if ( 2 < ary.GetSize() ) { data = ary[1] ; }


これって何とかならないものかといつも思ってしまう.
クラスとして書いた時には,デフォルト値を返すようにしたりしているが…

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

S.M.A.R.T. 障害が検出されました

2022/05/06 に不良セクタが発生したドライブ.この時,プチフリーズの様な現象で気づいた.
E ドライブ 不良セクタ
すぐにデータなどは他のデバイス( \\DS220\Public\ )にコピーしたので,特に失われたものはないと思う.


その後テンポラリ( VC の Fallback や SymbolCache )として使って様子を見ていた.
時々,少し遅くなることはあったが,エラーになるようなことはなかったと思う.
前回,この PC の別のドライブが壊れた時のものは次の所.
https://mish.hatenablog.jp/entry/2021/03/04/PC_D_drive_WD_Red_


今日 CrystalDiskInfo を見ると「異常」に.
E ドライブ 「異常」
イベントビューアにも「重大」として記録されている.
E ドライブ 「異常」
もうダメみたい.どうしたものか?


* 不良セクタなどが発生した場合,バックアップがない場合のみコピーして,アクセスしない様にして下さい.
  「デュプリケーター」でコピーすることにより,失うものを最小限にすることができるかもしれません.

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

MDI exe に lnk のドロップで開けない

MDI exe に lnk(ドキュメントへのショートカット)をドロップすると,
MDI exe に lnk をドロップ 「エラーはありませんでした。」
—————————
BLAM
—————————
エラーはありませんでした。
—————————
OK
—————————


ショートカット先のドキュメントファイルであれば開ける.
一度 GetOpenFileName などで ダイアログを開くと,その後は問題ない.


デバッガで追いかけると,AfxResolveShortcut でエラーになっている.


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

	if (!AfxOleInit()) {
		AfxMessageBox(_T("OLE の初期化に失敗しました。")) ;
		return	FALSE ;
		}

今回これを調べたのは,WM_DROPFILES の動作.
InitInstance で次の様にしている場合,CMainFrame::OnDropFiles で処理する.
m_pMainWnd->DragAcceptFiles();


MDI exe では,CView や CChildFrame で処理できそうだが,そのままでは呼ばれることはない.
予めそれぞれで DragAcceptFiles() が必要みたい.
例えば,次の様に CView で呼び出すと WM_DROPFILES が処理できる様になる.

void CBLAMView::OnInitialUpdate() 
{
	this->DragAcceptFiles();
//	...
	}
void CBLAMView::OnDropFiles(HDROP hDropInfo) 
{
	CView::OnDropFiles(hDropInfo);
	}

CMainFrame など以外の実装は Default() を呼出しているだけみたい.

_AFXWIN_INLINE void CWnd::OnDropFiles(HDROP)
	{ Default(); }

ビューのウィンドウ以外(グレーの部分)にドロップすると CMainFrame::OnDropFiles が呼ばれる.


C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30133\atlmfc\src\mfc\winfrm.cpp
void CFrameWnd::OnDropFiles(HDROP hDropInfo)
{
	SetActiveWindow();      // activate us first !
	UINT nFiles = ::DragQueryFile(hDropInfo, (UINT)-1, NULL, 0);

	CWinApp* pApp = AfxGetApp();
	ASSERT(pApp != NULL);
	for (UINT iFile = 0; iFile < nFiles; iFile++)
	{
		TCHAR szFileName[_MAX_PATH];
		::DragQueryFile(hDropInfo, iFile, szFileName, _MAX_PATH);
		pApp->OpenDocumentFile(szFileName);
	}
	::DragFinish(hDropInfo);
}

winfrm.cpp  CFrameWnd::OnDropFiles


CMainFrame で CDocument などを求める.
SDI の場合

CDocument*	pActiveDoc = GetActiveDocument() ;
CXxxView*	pView = (CXxxView*)GetActiveView() ;

MDI の場合は,GetActiveFrame() で CFrameWnd を求めてから.

CFrameWnd*	pActiveFrame = GetActiveFrame() ;

CDocument*	pActiveDoc = NULL ;
if (pActiveFrame != NULL) {
		pActiveDoc = pActiveFrame->GetActiveDocument() ;
		}

CXxxView*	pView = NULL ;
if (pActiveFrame != NULL) {
		pView = (CXxxView*)pActiveFrame->GetActiveView() ;
		}
Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

AfxResolveShortcut

個人的に作成したダイアログベースのツールで,lnk をドロップした時に開けない.
S_asZ に lnk をドロップ
これに対応するには,lnk から doc を求めることで対応できる.
同じ様に作成した SDI exe の場合は,うまく開ける?
デバッガで追いかけると,CDocManager::OpenDocumentFile で AfxResolveShortcut を呼んでいる.
CDocManager::OpenDocumentFile で AfxResolveShortcut
但し,MFC のバージョンにより? ::CoInitialize が呼び出されていないと 1 回だけ.
CFileDialog などを呼出すと ::CoInitialize にあたるものが呼び出されるのでその後はうまくいく.
https://dev.mish.work/wordpress/2021/03/31/win10-21h1-mdi-exe-error/


次の様な関数を用意して,ドロップされたファイルが lnk の時に対応.

tstring	LNK_Get_path	(HWND hwnd,LPCTSTR lnk_path)
{
	tstring	doc_path = lnk_path ;
	if (::Path_GetExtLow(lnk_path) == _T("lnk")) {
	      	doc_path = ::Get_path_lnk(hwnd,lnk_path) ;
		}
	return	doc_path ;
	}
Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

VNC 接続が安定しない?

最近は使う頻度が減ってきたが…
QNAP NAS の Virtualization Station の Win10 x86 への VNC 接続が安定しない.
他にも幾つか登録しているが,うまく開けないものが多い.
また Android からは,いつからかわからないが開けなくなってしまっている.
Android からの VNC 接続
Virtualization Station へはブラウザからも接続できて操作はできるが,ちょっと反応が悪い.


VNC のクライアントは VNC Viewer ,サーバは UltraVNC を使用している.
ハッキリわからないが,Win10 などのバージョンが上がった関係か?


先ず VNC Viewer を Windows 版 6.21.1109 に更新.Android 版は最新版になっていた.
予想通りだが,特に変わらず.


サーバ側の UltraVNC は 1.2.24 や 1.2.40 が入っていた.これを 1.3.60 に更新.
インストール後,再起動が要求されるが,試しに Android から接続するとうまくいった.
どうも UltraVNC が古いことがまずかったと思われる.
Windows Server 2022 に VNC 接続

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

IShellLink::SetShowCmd

ツールなどのスタートアップへの登録.


スタートアップのパスの取得は次の様な感じ.

	LPITEMIDLIST	pidl = 0 ;
	::SHGetSpecialFolderLocation(NULL,CSIDL_STARTUP,&pidl) ;
	tstring	start_path = ::SH_GetPathFromIDList(pidl) ;

lnk の作成は,以前にツールを作成してその時のものを利用.
http://mish.work/joomla/index.php/i-tools/create-l.html
https://mish.myds.me/wordpress/dev/2020/01/11/msdn-createlink/
lnk のスタートアップへの登録は次の様にできる.

	tstring	start_lnk = ::Path_AddLastSP(start_path) + ::Path_GetTitle(file_path) + _T(".lnk") ;
	tstring	descript = _T("コメント") ;
	::Create_lnk(file_path.c_str(),start_lnk.c_str(),descript.c_str()) ;

今回は,robocopy のコマンドを BAT ファイルとして生成し,それをスタートアップへ登録したかった.
http://mish.work/joomla/index.php/i-tools/cl-copy.html
「ディレクトリ以下のコピー」ツール
動作としてはうまく機能するが,BAT ファイルを使用しているためコマンドプロンプトが表示されてしまう.
最小化された状態で起動する方が動作はスマート?
lnk 作成時に指定できるだろうと思い 検索 するとあった.
シェルリンク
IShellLink::SetShowCmd を使えば良さそう.
SW_SHOWMINIMIZED を指定してもうまく動作しない.SW_SHOWMAXIMIZED はうまく動作する.
SW_SHOWMINIMIZED ではなく SW_SHOWMINNOACTIVE を使うみたい.
::Create_lnk(file_path.c_str(),start_lnk.c_str(),descript.c_str(),work_dir.c_str(),SW_SHOWMINNOACTIVE) ;
::CreateLink している所を変更してうまくいった.
S_lnk.hxx

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

WS2022 IIS 環境に PHP インストール

先日作成した Windows Server 2022 の IIS 環境 に PHP をインストール.
先ず,CGI を追加.
CGI の追加


Web PI のインストール.
Web Platform Installer で PHP 8 のインストール.
PHP 8 のインストール
次の内容の php を開き,うまく動作していることを確認.
<?php phpinfo(); ?>

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

::CreateMutex の名称

以前作成した W_mutex を利用.
同じドキュメントを開かない様なガードに使えると思い,単体テスト用のコードを書いた.

#include	"messbar.hxx"
#include	"itls_tmp.hxx"
#include	"cmd_line.hxx"
#include	"S_Exec.hxx"
#include	"W_mutex.hxx"

tstring	make_mutex_name	(const tstring& doc_name)
{
	tstring		mutex_name ;
	v_tstring	argv = ::get_arg() ;
	if (argv.size() > 0) {
		mutex_name += argv[0] ;
		mutex_name += _T(" ") ;
		}
	mutex_name += doc_name ;
///////////////////////////////////////////////////////////////
//	mutex_name = ::Path_Normalize(mutex_name,_T('/')) ;
///////////////////////////////////////////////////////////////
	std::terr << mutex_name << std::endl ;
	return	mutex_name ;
	}

bool	t_wait	(const tstring& doc_name)
{
	tstring		mutex_n = ::make_mutex_name(doc_name) ;
	size_t		bar_max = 1000 ;
	MessageBar	bar(_T("wait"),bar_max) ;
	for (size_t index=0 ; index<bar_max ; index++) {
		::Sleep(100) ;
		W_mutex	mutex(mutex_n.c_str()) ;
		bar.SetBarInc() ;
		if (mutex.Is_exist()) {
			}
		else {
			break ;
			}
		}
	return	true ;
	}

bool	t_loop	(const tstring& doc_name)
{
	tstring		mutex_n = ::make_mutex_name(doc_name) ;
	W_mutex		mutex(mutex_n.c_str()) ;
	size_t		bar_max = 100 ;
	MessageBar	bar(_T("loop"),bar_max) ;
	for (size_t index=0 ; index<bar_max ; index++) {
		bar.SetBarInc() ;
		::Sleep(30) ;
		}
	::Sleep(2000) ;
	return	true ;
	}

bool	test	(const tstring& doc_name)
{
	::t_wait(doc_name) ;
	::t_loop(doc_name) ;
	return	true ;
	}

int	_tmain	(int argc,TCHAR* argv[])
{
	_tsetlocale(LC_ALL,_T("")) ;
	::reg_argv(argc,argv) ;
	if (argc > 1) {
		test(argv[1]) ;
		}
	else {
		time_t	now = ::time(NULL) ;
		size_t	count = 5 ;
		tstring	test_cmd ;
		S_Exec	se ;
		{
			tstring	exe_name ;
			tstring	tmp_name ;
			{
				exe_name = argv[0] ;
				}
			{
				tstring	temp_dir = ::Get_i_Tools_tmp() ;
				tstring	time_str = ::Now_Format(_T("%H%M%S")) ;
					tmp_name = ::Path_AddLastSP(temp_dir) + time_str + _T(".tmp") ;
				}
			{
				test_cmd = exe_name + _T(" ") + tmp_name ;
				}
			{
				se.SetFile      (exe_name.c_str()) ;
				se.SetParamaters(tmp_name.c_str()) ;
				}
			{
				for (size_t index=0 ; index<count ; index++) {
					std::terr << test_cmd << std::endl ;
					se.Execute() ;
					::Sleep(2000) ;
					}
				}
			{
				::Sleep(1000) ;
				tstring		mutex_n = ::make_mutex_name(tmp_name.c_str()) ;
				size_t		bar_max = 1000 ;
				MessageBar	bar(_T("test wait "),bar_max) ;
				for (size_t index=0 ; index<bar_max ; index++) {
					W_mutex	mutex(mutex_n.c_str()) ;
					if (mutex.Is_exist()) {
						bar.SetBarInc() ;
						::Sleep(100) ;
						}
					else {
						break ;
						}
					}
				}
			}
		}
	return	0 ;
	}

#include	"messbar.cxx"

Mutex の名称としては,exe 名とドキュメント名を連結したものとした.


最初,実行させるとうまく動作しない(Mutex オブジェクトが存在するはずなのに抜ける).
::CreateMutex に与えている名称がうまくなかった.’\’ が使えない.
パスの区切りを ‘/’ に変更してうまくいった.
CreateMutex の名称で '\' は使えない


次の様なコードをアプリケーションクラスの InitInstance に追加.

	{
		if (cmdInfo.m_nShellCommand == CCommandLineInfo::FileOpen) {
			tstring	doc_name = cmdInfo.m_strFileName ;
			tstring	exe_name = ::Get_module_name() ;
			tstring	mtx_name = exe_name + _T(" ") + doc_name ;
				mtx_name = ::Path_Normalize(mtx_name,_T('/')) ;
			static	W_mutex	mutex(mtx_name.c_str()) ;
			if (mutex.Is_exist()) {
				return	FALSE ;
				}
			}
		}
Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

再起動マネージャ

何年か前に有効にした「再起動マネージャ」.
VC 2010 再起動マネージャ
Restart Manager in MFC
MFC 再起動マネージャ
その実装がうまくなかった.


編集操作中に「自動保存」が動作すると,意図しない状態になってしまうことがあった.
原因は,実装方法がうまくないだけではあるが,なかなか難しい.
Serialize が呼ばれた時に,一部の情報を更新しているため,例えば選ばれているものに影響を与えてしまう.
実際はデータに応じて選択状態が変わるのだが,それに気づかず操作してしまうことがある.


これとは別にバックアップ機能を持っているので「自動保存」が動作しない様に修正することに.
本当はこれだけでは足りない.
編集操作中に「上書き保存」された時も同様に動作するため,この部分の修正が必要か?
ユーザが意識している操作なので,現状のままとするか?

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

VS Installer

久しぶりにインストーラを…
今までのものは「VS インストーラ」.


前も使ったが忘れていた.アンインストールで,ファイルをそのまま残す設定.
「Permanent」を「True」に.
アンインストール時,ファイルをそのまま残す


ショートカットなどを作成すると,アンインストール時に時間がかかってしまう.
それで,以前は使ってなかったが,更新版のインストール.
「RemovePreviousVersions」を「True」に.
「Version」を更新する.同様に exe などの更新も必要.bmp などはタイムスタンプでいける?
更新版の設定


Patching and Upgrades


2024/06/21
どこかに設定があるのかもしれないが「Permanent」を「True」としてインストール後「False」としても効かない?
01727 : アンインストール時にファイルが削除されない(msi 形式 インストーラ)
次の所に “00000000000000000000000000000000” が入っているので削除する必要があった.
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components\…
いろいろ検索してみたが,レジストリの該当箇所を削除するしかなさそう.
Recommended way to uninstall a file that was configured as “Permanent” once

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

AS5202T VirtualBox に WS2022

ASUSTOR NAS AS5202T の VirtualBox 環境に Windows Server 2022 のインストール.
最初,リモート接続するための設定箇所がわからなかった.
Net Address の所に,アドレス(127.0.0.1 だったと思う)が入っていて,それをクリアする必要があった.
VirtualBox Remote Display Net Address をクリア
あとは,通常の手順.
ASUSTOR NAS に WS2022 インストール


「Ctrl」+「Alt」+「Delete」にあたるものがわからなかったが,これは,「Ctrl」+「Alt」+「End」.
「Ctrl」+「Alt」+End」


マウスの位置がずれていたが,VirtualBox Guest Additions を入れて対応.


VS 6 と SP6 を入れて,今の所デバッグなどもできている.
https://dev.mish.work/wordpress/2021/06/10/win-10-vs6-install/


2021/11/10
リモートデスクトップ内の画面コピーは,「Ctrl」+「Alt」+「+」.
アクティブウィンドウのコピー     「Ctrl」+「Alt」+「-」.


2021/11/29
LAN 上の他の PC からの参照は問題なさそうだが,WS2022 から他の PC への参照が非常に遅い.
以前同じ様な環境に Win10 を入れていたが,この時も他からの参照のみだったので気づかなかった.
PC 上の仮想マシン は,速くはないが使えるレベル.NAS なので,これが限度か?


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

WS2022 Classic ASP インストール

Windows Server 2022 を VirtualBox 仮想マシンにインストール.
Windows Server 2022 インストール
Windows Server 2022 インストール OS の選択
Windows Server 2022 インストール カスタムを選択
Windows Server 2022 インストール中
Windows Server 2022 インストール完了
特に難しい所はない.


続いて Classic ASP のインストール.
「サーバーマネージャー」で「管理」-「役割と機能の追加」.
「サーバーの役割」で「Web サーバー(IIS)」を選択.
「Web サーバー(IIS)」を選択
「役割サービス」で「ASP」を選択.
「役割サービス」で「ASP」を選択
ASP をインストール.
ASP をインストール


簡単な asp ファイルを作成.
MSDN 2001/10
mk:@MSITStore:C:\Program%20Files%20(x86)\Microsoft%20Visual%20Studio\MSDN\2001OCT\1041\jpiis.chm::/iishelp/iis/htm/asp/iiwabasi.htm


<%@ Language=VBScript %>
<HTML>
<BODY>
This page was last refreshed on <%= Now() %>.
</BODY>
</HTML>
Classic ASP の動作テスト


参考にさせてもらったところ.
Windows Server 2022 にIIS 10.0をインストールし、ASP.NETを有効化
windows server 2016で、classic asp を有効化
Windowsの機能の有効化(Windows Server 2016)
Windows のパスワードの複雑性の要件を無効にする (Windows Server Tips)
繋がらない!Windows10で共有フォルダにアクセスできない時の対処法


次のツールも問題なく動作した.
Win10 用 タイトルバーの色設定


2021/11/08
入っている MFC*.dll .
WS2022 に入っている MFC*.dll
WS2022 に入っている MFC*.dll
WS2022 に入っている MFC*.dll


2021/11/09
共有フォルダにアクセスしようとすると,アクセスできない.
[Window Title]
ネットワーク エラー
[Main Instruction]
\\WS2022 にアクセスできません
[Content]
名前のスペルを確認しても問題がない場合は、ネットワークに問題がある可能性があります。ネットワークの問題を識別して解決するには、[診断] をクリックします。
[^] 詳細を非表示にします [診断(D)] [キャンセル]
[Expanded Information]
エラー コード: 0x80070035
ネットワーク パスが見つかりません。
エラー コード: 0x80070035 ネットワーク パスが見つかりません。
Win7 環境や Win10 20H2 などからは問題なくアクセスできる.
グループポリシーでゲストログオンを許可する」必要があった.
グループポリシーでゲストログオンを許可する


ASP ActiveX dll exe の設定など

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

サーチコンソールの警告と VirusTotal

以前から,このサイトで「一般的ではないダウンロード」の警告が表示されている.
「一般的ではないダウンロード」の警告
対応方法がわからずそのままとなっていた.


ウィルス対策ソフト 誤検知」などで調べていて,VirusTotal を見つけた.
同じコードでも VC の異なるバージョンでビルドしたもので結果が異なる.

VC 8 11 12 141 142
GLSm 0 Cylance
Unsafe
0 Cylance
Unsafe
0
i3DC 0 Cylance
Unsafe
Microsoft
Trojan:Win32/Sabsik.FL.B!ml
Microsoft
Trojan:Win32/Sabsik.FL.B!ml
0
i3DV 0 Cylance
Unsafe
Microsoft
Trojan:Win32/Sabsik.FL.B!ml
0
S_as SecureAge APEX
Malicious
SecureAge APEX
Malicious
0 0
TDIB 0 Cylance
Unsafe
0 0

VC 6   SecureAge APEX Malicious
VC 9   SecureAge APEX Malicious , VBA32 Heur.Malware-Cryptor.Hlux
VC140  Cylance Unsafe
VC 10 , 142 は 0 .
これで順につぶしていけば,「一般的ではないダウンロード」の警告はなくなるか?

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

削除中にエラーが発生しました

また,削除できないキーができてしまった.
[Window Title]
キーの削除エラー
[Content]
・ を削除できません。削除中にエラーが発生しました。
[OK]
レジストリエディタ キーの削除エラー
RegDelNull を探すと,場所が変わっていた.
RegDelNull v1.11
使い方は以前と同じ

Microsoft Windows [Version 10.0.19043.1288]
(c) Microsoft Corporation. All rights reserved.

C:\Users\Iwao>cd %TMP%

C:\Users\Iwao\AppData\Local\Temp>J:\Download\Tools\MS\Regdelnull\RegDelNull.exe

RegDelNull v1.11 - Delete Registry keys with embedded Nulls
Copyright (C) 2005-2016 Mark Russinovich
Sysinternals - www.sysinternals.com

Scan complete.


C:\Users\Iwao\AppData\Local\Temp>J:\Download\Tools\MS\Regdelnull\RegDelNull.exe hkcu\SOFTWARE\Iwao\****\x86\BAPMan

RegDelNull v1.11 - Delete Registry keys with embedded Nulls
Copyright (C) 2005-2016 Mark Russinovich
Sysinternals - www.sysinternals.com

Null-embedded key (Nulls are replaced by '*'):

HKCU\SOFTWARE\IWAO\****\X86\BAPMAN\?*

Delete? (y/n) y
Key successfully deleted.

Scan complete.


C:\Users\Iwao\AppData\Local\Temp>

RegDelNull の使い方

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

::SetWindowPos(hWnd,…)

wndTopMost で,Z オーダーの最前面に.

{
	CRect	rect ;
	GetWindowRect(&rect) ;
	SetWindowPos(&wndTopMost,rect.left,rect.top,0,0,SWP_NOSIZE|SWP_NOACTIVATE) ;
	}

幾つかの環境ではこれでうまく動作している.


今日作成したツールの CMSetNmTDlg::OnInitDialog() にこれを追加.
omp_set_num_threads
Win10 のホスト環境で最前面に移動しない.
仮想マシンで試すと意図した動作.
ホストの,以前に起動したツールは前面のまま保持された.
が,一度終わらせて再起動したら,最前面にならなくなった.
ちょっとよくわからないが,何かが邪魔しているのか?
PC を再起動すれば直るかもしれないが…
とりあえずメモ.


2021/10/25
explorer.exe の再起動でうまく動作する様になったみたい.


他 AP などからの操作の場合 SetForegroundWindow


2023/07/12
Windows API だと次の様に指定できる.

::SetWindowPos(this->GetSafeHwnd(),HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE) ;

2 つ目の引数は次のものが指定可能.

#define HWND_TOP        ((HWND)0)
#define HWND_BOTTOM     ((HWND)1)
#define HWND_TOPMOST    ((HWND)-1)
#define HWND_NOTOPMOST  ((HWND)-2)

::SetWindowPos   Flags


2024/12/04
MFC では次の方が簡単?

{
	SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE) ;
	}
Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

高 DPI

先日の更新で,ツールバーのボタンが小さくなった?という報告を受けたので,ちょっとまとめてみた.

DPI 認識 DPI 対応 「互換性」タブ
なし 非対応 システム
高い DPI 認識 システム  
モニターごとの高い DPI 認識 モニターごと アプリケーション

プロジェクトの「プロパティ」-「マニフェストツール」-「DPI 認識」
「タスクマネージャー」での表示
上から,非対応,システム,モニターごとx2 .下から 2 つ目は,100% のディスプレイから移動したもの.
GLSmth の「バージョン情報」

高 DPI デバイスでの Windows のスケーリングの問題
PROCESS_DPI_AWARENESS enumeration (shellscalingapi.h)
C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\um\ShellScalingApi.h

いろいろ試したが,特にツールバーボタンの関係ではわからなかった.


2021/10/14
どうも,プライマリディスプレイの設定によりスケーリング動作が異なる?
ImageLook タスクマネージャ
125% にしたもの.
プライマリディスプレイを 125% に
右下の 3 つのツールバーとダイアログの大きさなどがスケーリングされない.
それら以外の,メニューやステータスバーなどは正しくスケーリングされている様に見える.
VirtualBox の「スケールモード」で 80% 程度にしたもの.
80% 程度にして,ホストのウィンドウを重ね合わせ


exe のプロパティで「アプリケーション」としたもの.
exe のプロパティで「アプリケーション」に
ダイアログのフォントに固定サイズのものを使用しているので少し文字間隔が広くなってしまっている.
https://jml.mish.work/index.php/i-tools/setcolt.html

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

コンソール AP での色

以前に NAS に SSH 接続した環境で,文字色などの変更 をやった.
確か DOS 時代に少し使った記憶があるが,コンソール AP で使ってみたいと思い調べてのメモ.


先ず,コマンドプロンプトでの動作から.
echo ^G
echo Ctrl+G   BEL
‘^G’ の入力は,「Ctrl」+「G」.
「Enter」すると,ブザー(BEL)が鳴る.
今度は,次の様なバイナリデータのファイルを用意しての表示.
ESC シーケンス バイナリデータ
それを type で表示する(Linux 環境などでは cat ).
type esc.txt
type esc.txt の結果
echo を使っての ‘ESC [‘ 入力がわからなかったが,いろいろ試すと「Ctrl」+「[」で入った.
echo ^[[103m
echo ^[[30m
echo ^[[103m    echo ^[[30m
最初わからなかったが,Linux 環境などでは
echo -e “\x1b[103m”
BEL の所に書いてあった.


以前試した時もそうだったと思うが,コマンドプロンプトでそのまま実行してもうまく機能しない.
またその頃はまだメインの開発機は Win7 だったこともありそれ以上は試していなかった.
以前の T_esc 2018 05 exe
一度ファイルにリダイレクトして type すると意図した動作になる.
Windows ESC CSI」で検索すると次の所が見つかる.
コンソールの仮想ターミナル シーケンス
ここを見ると ::SetConsoleModeENABLE_VIRTUAL_TERMINAL_PROCESSING を指定するとある.
それで次の様なコードで試すとうまくいった.

#ifdef		_WIN32
	#ifdef	ENABLE_PROCESSED_OUTPUT
		#ifndef	ENABLE_VIRTUAL_TERMINAL_PROCESSING
		#define	ENABLE_VIRTUAL_TERMINAL_PROCESSING	0x0004
		#endif
	#endif
#endif
//	...
{
//	...
	can_CSI = true ;
	#ifdef		_WIN32
		BOOL	can_ESC = FALSE ;
		#ifdef	ENABLE_PROCESSED_OUTPUT
			HANDLE	hout =	::GetStdHandle(STD_OUTPUT_HANDLE) ;
			DWORD	mode = 0 ;
					::GetConsoleMode(hout,&mode) ;
				mode|= ENABLE_VIRTUAL_TERMINAL_PROCESSING ;
			can_ESC =	::SetConsoleMode(hout, mode) ;
		#endif
		can_CSI = (can_ESC == TRUE) ;
	#endif
	if (change_bg) {
		if (can_CSI) {
			std::terr << _T("\x1b[107m") ;
			std::terr << _T("\x1b[30m") ;
			std::terr << _T("\x1b[0J") ;
		//	std::terr << _T("\x1b[;H") ;
			}
		}
//	...
	}

CSI.hxx
CSI クラスを使用したもの
ちょっとうまくない部分もある?が,何とか.


python だと

from ctypes import windll , wintypes , byref
kernel = windll.kernel32
hout = kernel.GetStdHandle(-11)
mode = wintypes.DWORD()
kernel.GetConsoleMode(hout,byref(mode))
mode.value |= 4
kernel.SetConsoleMode(hout,mode)
print ('\033[96m')

参考にさせてもらったところ.
第3章5 エスケープシーケンスで文字の色、背景の色を変更


2023/03/24
次の様に利用できる.

#include	<iostream>

#include	"CSI.hxx"
#include	"tstring.hxx"

int	_tmain	(int argc,TCHAR* argv[])
{

	CSI	csi ;

	{
		tstring	buf ;
		buf.resize(1000) ;
		std::terr << _T("wait...") ;
		std::tin.getline(&buf[0],std::streamsize(buf.size())) ;
		}
	return	0 ;
	}

CSI クラスの利用

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

::GetDiskFreeSpaceEx , ::statvfs

Win9x が多く存在していた頃のコードの MFC を使用しない方法での書き直し.
前のものは次の様になっている.

//	J048221	SDK32:GetDiskFreeSpace と GetDiskFreeSpaceEx について
typedef BOOL (WINAPI *P_GDFSE)(LPCTSTR, PULARGE_INTEGER,PULARGE_INTEGER, PULARGE_INTEGER);
// ..
	fResult = ::GetDiskFreeSpace(pszDrive,&SectorsPerCluster,&BytesPerSector,&FreeClusters,&TotalClusters) ;
	if (fResult) {
		TotalBytes    	= (__int64)TotalClusters * SectorsPerCluster * BytesPerSector ;
		TotalFreeBytes	= (__int64)FreeClusters  * SectorsPerCluster * BytesPerSector ;
		FreeBytesAvailable = TotalFreeBytes ;
		}
// ..
{
	P_GDFSE	pGetDiskFreeSpaceEx = NULL;
	#ifdef UNICODE
		pGetDiskFreeSpaceEx = (P_GDFSE)GetProcAddress(GetModuleHandle(_T("kernel32.dll")),"GetDiskFreeSpaceExW") ;
	#else
		pGetDiskFreeSpaceEx = (P_GDFSE)GetProcAddress(GetModuleHandle(_T("kernel32.dll")),"GetDiskFreeSpaceExA") ;
	#endif
	if (pGetDiskFreeSpaceEx) {
		fResult = pGetDiskFreeSpaceEx (pszDrive,
			(PULARGE_INTEGER)&FreeBytesAvailable,
			(PULARGE_INTEGER)&TotalBytes,
			(PULARGE_INTEGER)&TotalFreeBytes);
		}
	}

J048221 SDK32:GetDiskFreeSpace と GetDiskFreeSpaceEx について
https://www.betaarchive.com/wiki/index.php?title=Microsoft_KB_Archive/231497


Windows 環境では次の様な感じ?

class	DiskFree	{
public:
	DiskFree ()	{	Free = Total = 0 ;	}
public:
	u_64	Free ;
	u_64	Total ;
	} ;

DiskFree	GetDiskFree	(LPCTSTR path)
{
	DiskFree	df ;
	u_64		freeC = 0 ;
	u_64		free  = 0 ;
	u_64		total = 0 ;
	if (::GetDiskFreeSpaceEx(path,(PULARGE_INTEGER)&freeC,(PULARGE_INTEGER)&total,(PULARGE_INTEGER)&free)) {
		df.Free = free ;
		df.Total= total;
		}
	return	df ;
	}

Linux 環境では ::statvfs が使えるみたいで,次の様なコードで取得してデバッガで確認.

#include    <iostream>
#include    <sys/statvfs.h>

int main()
{
	struct statvfs	vfs = { 0 } ;
	::statvfs(".", &vfs) ;
	return 0 ;
	}
vfs     	{...}           	statvfs
  f_bsize 	4096            	unsigned long
  f_frsize	4096            	unsigned long
  f_blocks	1452408524      	__fsblkcnt_t
  f_bfree 	200259802       	__fsblkcnt_t
  f_bavail	199469255       	__fsblkcnt_t
  f_files 	183001088       	__fsfilcnt_t
  f_ffree 	181248356       	__fsfilcnt_t
  f_favail	181248356       	__fsfilcnt_t
  f_fsid  	3941329918106335254	unsigned long
  f_flag  	4096            	unsigned long
  f_namemax	255             	unsigned long
  __f_spare	                 	int [6]
    [0]   	0               	int
    [1]   	0               	int
    [2]   	0               	int
    [3]   	0               	int
    [4]   	0               	int
    [5]   	0               	int

Debian10 ::statvfs

Iwao@AS5202T:/volume1/home/Iwao $ cd gcc_test/Test/t_linux/T_vfs/T_s_vfs/
Iwao@AS5202T:/volume1/home/Iwao/gcc_test/Test/t_linux/T_vfs/T_s_vfs $ ll
total 12
drwxrwxrwx    2 Iwao     users       4.0K Jul  1 22:01 ./
drwxrwxrwx    4 Iwao     users       4.0K Jul  1 22:00 ../
-rwxrwxrwx    1 Iwao     users        581 Jul  1 21:55 T_s_vfs.cpp*
Iwao@AS5202T:/volume1/home/Iwao/gcc_test/Test/t_linux/T_vfs/T_s_vfs $ cat T_s_vfs.cpp
#include    <iostream>
#include    <clocale>

#include    <sys/statvfs.h>

#include    "_tdefine.hxx"
#include    "t_tstrng.hxx"

int     _tmain  (int argc,TCHAR* argv[])
{
        _tsetlocale(LC_ALL,_T("")) ;
        {
                struct  statvfs vfs = { 0 } ;
                if (::statvfs(".", &vfs) == 0) {
                        u_64    free = vfs.f_bavail * vfs.f_frsize ;
                        u_64    total= vfs.f_blocks * vfs.f_frsize ;
                        std::tout << ::To_tstring_Ki(free) << _T(" / ") << ::To_tstring_Ki(total) << std::endl ;
                        std::tout << ::To_tstring_cs(free) << _T(" / ") << ::To_tstring_cs(total) << std::endl ;
                        }
                }
        return  0 ;
        }
Iwao@AS5202T:/volume1/home/Iwao/gcc_test/Test/t_linux/T_vfs/T_s_vfs $ g++ T_s_vfs.cpp -Wall
Iwao@AS5202T:/volume1/home/Iwao/gcc_test/Test/t_linux/T_vfs/T_s_vfs $ ./a.out
760.90 G /   5.41 T
817,005,420,544 / 5,949,065,314,304
Iwao@AS5202T:/volume1/home/Iwao/gcc_test/Test/t_linux/T_vfs/T_s_vfs $

AS5202T  ::statvfs
diskfree.hxx

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

SHBrowseForFolder

今度はフォルダの参照.
ダイアログを表示するだけの最低限のコード.

#include	<ShlObj.h>

bool	Test	(void)
{
	BROWSEINFO	bi	=	{	0	} ;
	LPITEMIDLIST	pidl	= ::SHBrowseForFolder(&bi) ;
	if (pidl == NULL)	{	return	false ;		}
	::CoTaskMemFree(pidl) ;
	return	true ;
	}

int	main	(void)
{
	while	(true)	{
		if (!Test()) {
			break ;
			}
		}
	return	0 ;
	}

SHBrowseForFolder VC 6
SHBrowseForFolder hwndOwner のみ指定
BROWSEINFO の hwndOwner も指定していないので動作がモードレスになってしまう.


SHBrowseForFolder のドキュメントを見ると IFileDialog FOS_PICKFOLDERS とある.


選択したフォルダ名を戻すように変更.

tstring	SH_GetPathFromIDList	(LPCITEMIDLIST pidl)
{
	tstring	path ;
	path.resize(MAX_PATH+10) ;
	BOOL	result = ::SHGetPathFromIDList(pidl,&path[0]) ;
	return	path.c_str() ;
	}

tstring	Test	(void)
{
	BROWSEINFO	bi	 =	{	0	} ;
	bi.ulFlags		|=	BIF_RETURNONLYFSDIRS ;
	bi.ulFlags		|=	BIF_NEWDIALOGSTYLE ;
	bi.ulFlags		|=	BIF_NONEWFOLDERBUTTON ;
	LPITEMIDLIST	pidl	 = 	::SHBrowseForFolder(&bi) ;
	if (pidl == NULL)	{	return	tstring() ;		}
	tstring	path = ::SH_GetPathFromIDList(pidl) ;
	::CoTaskMemFree(pidl) ;
	return	path ;
	}

pszDisplayName を指定すると,選択されたフォルダ名が返る.

	tstring		disp_name ;
	disp_name.resize(MAX_PATH) ;
	bi.pszDisplayName	 =	&disp_name[0] ;
//	...	SHBrowseForFolde
	std::tout << disp_name.c_str() << std::endl ;

初期フォルダ指定の追加.

int	CALLBACK	SH_BrowseCallback	(HWND hwnd,UINT uMsg,LPARAM lParam,LPARAM lpData)
{
	switch	(uMsg) {
		case	BFFM_INITIALIZED :
			::SendMessage(hwnd,BFFM_SETSELECTION,1,(LPARAM)(LPCTSTR)lpData) ;
			return	1 ;
			break ;
		default :
			return	0 ;
			break ;
		}
	return	0 ;
	}

{
//	...
	tstring		init_fold = init_fold_ ;
//	...
	bi.lpfn			 =	SH_BrowseCallback ;
	bi.lParam		 =	(LPARAM)init_fold.c_str() ;
	LPITEMIDLIST	pidl	 = ::SHBrowseForFolder(&bi) ;
//	...
	}

S_Browse.hxx
::Browse_Folder

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

Win10 に VS 6 インストール

今まで仮想マシンの WinXP で VC 6 を使用してきたが,ちょっと面倒なので Win10 環境に入れてみた.
使用したのは次の ISO .
en_visual_studio_6.0_professional_x86_dvd_224df581.iso
2021/04 に VS のダウンロードサイトで見つけた.
その時 Win7 環境などにインストールして動作することは確認済み.
Win7 に VS 6


インストール時,データベース関連を入れると止まると書かれていたので,外してインストール.
VB6開発環境をWindows 10にインストールする手順


VC 6 を簡単に確認した限りは何とか使えそう.


Win11 に VS 6 のインストール
Win11 22H2(デバッグできない時の設定も書いています)


2024/04/29
Win10 ,Win11 共に一部の制限があるものの VC 6 は特に問題なく使えている.


VC 6 から VC 2005 への移行
VC 6 から VC 201x への移行
VC 6 から VC 2022 への移行

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