ホーム » Windows
「Windows」カテゴリーアーカイブ
Win11 24H2 対応 ユーザの追加
先日 24H2 をいろいろ調べた時「ゲストログオンを有効にする」ことで対応した.
が,それではセキュリティの問題があるため改めて調べてみた.
それで検索してみたが,わかりやすいページがあまり見つからず,私の環境での設定をまとめた.
画像は仮想マシンで Win10 Home と Win11 Pro 24H2 を用意してのもの.
サーバ側 Win10-Home
「スタート」をクリックして「user」と入力.「他のユーザーの追加、編集、削除」を選択.
「他のユーザー」の「その他のユーザーをこの PC に追加」を選択.
「Microsoft アカウントを持たないユーザーを追加する」をクリック.
共有アクセスするためのユーザー(ここでは “cad” )を追加.この時,必ずパスワードを設定すること.
クライアント側 Win11-24H2
「スタート」をクリックして「shikaku」と入力.「資格情報マネージャー」を選択.
「Windows 資格情報」を選択.「Windows 資格情報の追加」をクリック.
「サーバー名」,「ユーザー名」,「パスワード」を入力して「OK」.
これで \\Win10-Home としてアクセスできる様になる.
Win11 Pro 24H2 インストール
先日 Win11 21H2 への 24H2 インストールは行ったが,今回は仮想マシンとしての 24H2 の新規インストール.
iso をセットして仮想マシンを起動すると…
BdsDxe: No bootable option or device was found.
BdsDxe: Press any key to enter the Boot Manager Menu.
仮想マシンの設定の「システム」-「マザーボード」-「EFIを有効化」のチェックを外すと iso を読み込む.
が,「この PC では Windows 11 を実行できません」.
単に「Press any key to boot from CD or DVD…」の時,キーがうまく入っていなかった.
ローカルアカウントで設定するには「職場または学校用に設定する」.
「サインイン オプション」を「クリック」.
「代わりにドメインに参加する」を「クリック」.
ユーザ名の入力になる.
VDI の圧縮
以前 VirtualPC を使用していた頃はよくやっていたこと.
VirtualBox になってからはあまり必要なかったが,Win11 24H2 のテストで使いたくなった.
手順は VirtualPC の頃とそれほど変わらない.
1. 不要なファイルを削除.
2. SDelete.exe -z c:
3. "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" modifyhd F:\VHD\Win11\Win11.vdi –compact
今回は 22H2 を 24H2 に上げた直後の VDI だったのて,50 GB 位になっていた.
確か 22H2 インストール直後は 20 GB 位.
圧縮実施後,24 GB 位になった.
リリース版 exe のデバッグ
先日の Win11 24H2 でうまくなかった現象を更に調べたことのメモ.
結論としては,InitInstance に確保される dlg のメンバ変数で初期化がされていないものがあったため.
最初リモートデバッグも考えたが,VC 8 では少し面倒なので VS 2005 をインストールした.
https://learn.microsoft.com/ja-jp/visualstudio/debugger/remote-debugging-cpp?view=vs-2022
インストールした VC 8 でビルドしたデバッグ情報付きのリリース exe でも不具合の現象は確認できた.
が,デバッグしようとすると欲しい情報の所でうまく表示されない部分があった.
そのため VS 2008 もインストールすることに.
VC 9 ではうまくデバッグできる様になった.
デバッガで追いかけると,ダイアログのメンバ変数が意図しない値になっていて,初期化されていないことがわかった.
修正自体は簡単だが,なぜ今まで…
初期化されていないことによりゴミ(不定値)が入ることはわかる.
その変数は ‘1’ 以外だとうまく通る様になっていて,それが 24H2 でたまたま ‘1’ に?
Initinstance で確保される dlg はスタックに確保される.
デバッグ版 exe では,0 でないバイト値などで埋められることが多いが,リリース exe では 0 または不定値となる.
0 はまだ使われていない状態で,不定値は確保前に呼び出された関数で使用する変数やリターンアドレスなど.
一度実行して,次の所で設定されるポインタを求め,それをメモリダンプのアドレスに入力.
m_pMainWnd = &dlg;
再度実行して InitInstance で止めた時のメモリの状態.
今回の初期化されていない変数(赤くなっている次)が,’1′ になっていることを確認できた.
Win11 24H2 インストール
Win11 24H2 に上げた環境で,あるパッケージの 2021版での不具合が発生.
最新版にすることでうまく動作する様になったようだが,原因が絞れ切れない.
そのため仮想環境の Win11 21H2 を更新することに.
最初,更新しようとしても Win11 に対応していないと弾かれた.
原因は,仮想マシンを作成したのが VirtualBox 6.1 で TPM 2.0 になっていなかった.
Insider Program に参加したりしてみたが 23H2 までしか上げられなかった.
結局 24H2 の ISO を手に入れ,仮想マシンにマウントしてインストール.
不具合の現象を再現できた.
更に調べると VC 2005 でビルドした exe がうまくない様子.同じコードを 2015 以降でビルドしたものは問題ない.
VC 2008 ,2010 ,2012 ,2013 でビルドして試すと,2005 と 2008 がうまくないことがわかった.
他に 24H2 に更新したことにより,Win10 の共有ドキュメントに接続できなくなってしまった.NAS は OK .
2024/10/26
Win10 の共有ドキュメントに接続できなくなったことへの対応は,Win10 Ent の 2021/11 の時と同じ.
「ゲストログオンを有効にする」必要がある.
Windows11にアップグレード後、ネットワーク上の共有フォルダにアクセスできなくなった。
Windows 11 23H2 から 24H2 に更新するべきか?
Windows11 24H2を今すぐダウンロードしてアップデートする方法
2024/11/15
ゲストログオンを有効にしない共有アクセス用のユーザを追加しての対応方法
サムネイル表示が止まる?
以前作成したエクスプローラのサムネイル表示.
前からの現象だが,不定期に表示が止まってしまうことがあった.
ほとんどが個人的に作成したシェルエクステンションの影響だが,今回は違ったように思う.
全ての explorer.exe を終了させても改善されない.
再起動すれば良いのはわかっているが,順に exe を終了させることに…
dllhost.exe を終了させると,止まっていた表示が動き出した.
ハッキリしたことがわかってないので,とりあえずメモ.
0x80030002
次の様なエラーになると連絡が…
ファイルのコピー
予期しないエラーのため、ファイルをコピーできません。…
エラー 0x80030002: ***** が見つかりませんでした。
よくある “file not found” とはエラーコードが異なる.
ERROR_FILE_NOT_FOUND 0x00000002
また,更新日時やサイズが表示されているので「ファイルがない」わけではなさそう.
表示されているファイル名は ZIP 圧縮したファイルの一部?
タイトルバーがアプリケーション名などになっていないので,API 呼出しの中などで表示されているか?
0x80030002 は STG_E_FILENOTFOUND .
幾つか心当たりがある操作などを試してみたが,現象は確認できなかった.
その後現象が発生しなくなったとのことで詳細はわからず.とりあえずメモ.
VirusTotal 誤検知 trojan
以前よりは良くなった気もするが…
Avast Win32:Evo-gen [Trj]
AVG Win32:Evo-gen [Trj]
GData Win32.Trojan.Agent.8G1FEV
Ikarus Trojan-Spy.Evo
MaxSecure Trojan.Malware.121218.susgen
Skyhigh (SWG) GenericRXWN-PP!3F53C2B1E9DD
Trellix (ENS) Artemis!E2A95C89EB37
以前 VC 2017 などでビルドしたものは誤検知も少なかったと思うが,最近はそうでもない?
今年の初め位から誤検出が増えた気がする.
個人的なツールはほとんど問題ないが,一度誤検知されるとその後いろいろと面倒.
以前 McAfee に報告したが,その時は半年近くかかった.
コンソール AP でバージョン情報
::GetFileVersionInfo を使った FVersion.hxx が,他のコードに依存していたので整理.
次の様なコードで,コンソール AP のバージョン情報を表示できる.
#include "FVer_dmp.hxx"
int _tmain(int argc, TCHAR* argv[])
{
_tsetlocale(LC_ALL,_T("")) ;
::reg_argv(argc,argv) ;
::dmp_self_version() ;
::pause() ;
return 0 ;
}
「バージョン情報」ダイアログ
バージョンリソースを読み込み「バージョン情報」ダイアログの表示で使用するコード.
IDD_ABOUTBOX の IDC_STATIC を IDC_FV_DESCRIPTION_VERSION と IDC_FV_LEGAL_COPYRIGHT に変更.
???Dlg.cpp で次をインクルード.
#include "FVerDlg.hxx"
#include "i_trace.hxx"
次の様に OnInitDialog に ::SetAboutFileVer を追加.
BOOL CAboutDlg::OnInitDialog()
{
CDialog::OnInitDialog();
::SetAboutFileVer(this->GetSafeHwnd()) ;
return TRUE;
}
¥¥(コンピュータ名) を開く
\\(ComputerName) を開きたいと思い,次の様なコードを書いた.
{
tstring self_name = _T("\\\\") + ::GetComputerName() + _T("\\") ;
S_Exec se ;
se.SetFile(self_name.c_str()) ;
se.Execute() ;
}
これはこれでうまく動作するが,それを perplexity に問い合わせると
#include <windows.h>
#include <shellapi.h>
int main()
{
TCHAR computerName[MAX_COMPUTERNAME_LENGTH + 1];
DWORD size = sizeof(computerName) / sizeof(computerName[0]);
// コンピューター名を取得
if (GetComputerName(computerName, &size))
{
// ネットワークパスを構築
TCHAR networkPath[MAX_PATH];
wsprintf(networkPath, TEXT("\\\\%s"), computerName);
// ShellExecuteを使用してエクスプローラーを起動
ShellExecute(NULL, TEXT("open"), TEXT("explorer.exe"), networkPath, NULL, SW_SHOWNORMAL);
}
return 0;
}
そのままで動作するコードが表示されている.
コンソール AP のアイコン
以前,コンソール AP にアイコンなどのリソースを追加する方法はいろいろとやった.
それを今回,動作時にアイコンを変更できないかと…
最初 Copilot で問合わせたがうまい情報は引っ掛からなかった.
それで今度は最近利用し始めた perplexity で…
「Windows cpp で コンソール AP のアイコンを指定する方法と動的に変更する方法」と入力.
kernel32 にある SetConsoleIcon が使えるらしい.
それで次の様なコードを書いてみたが…
BOOL WINAPI SetConsoleIcon(HICON hIcon)
{
typedef BOOL (WINAPI *SetConsoleIconFn)(HICON);
static SetConsoleIconFn setConsoleIcon = NULL;
if (setConsoleIcon == NULL)
{
HMODULE hKernel32 = GetModuleHandleA("kernel32.dll");
if (hKernel32 == NULL) return FALSE;
setConsoleIcon = (SetConsoleIconFn)GetProcAddress(hKernel32, "SetConsoleIcon");
if (setConsoleIcon == NULL) return FALSE;
}
return setConsoleIcon(hIcon);
}
bool test (c_tstring& str)
{
std::terr << str << std::endl ;
::pause(10) ;
HICON hIcn2 = ::LoadIcon(::GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON2)) ;
HICON hIcn3 = ::LoadIcon(::GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON3)) ;
{
HWND hWnd = ::GetConsoleWindow() ;
::SendMessage(hWnd,WM_SETICON,TRUE, (LPARAM)hIcn2) ;
::SendMessage(hWnd,WM_SETICON,FALSE,(LPARAM)hIcn2) ;
}
::pause(20) ;
{
SetConsoleIcon(hIcn3) ;
}
::pause(30) ;
return true ;
}
Win7 や 8.1 ではうまく変更できたが,Win10 や 11 では変更できなかった.
robocopy エラー 87
IO DATA SSPA-USC500K が手に入ったので,テストを兼ねてソースなどをバックアップ.
自前の「ディレクトリ以下のコピー」ツールでコピーしていると…
100% 新しいファイル 1300 Vxx_P_A_.hxx
2024/06/23 15:44:41 エラー 87 (0x00000057) ファイル属性を変更しています \\DS220\Public\Document\Develop\_.SRC\__Iwao\P_A_gnsa.hxx
パラメーターが間違っています。
5 秒間待機しています... 再試行しています...
全てのファイルがこの様になるわけではない.
原因は,恐らくコピー先が exFAT のため?
ちゃんと調べたわけではないが,更新日時が古い(最近編集していない)ファイルでエラーになる模様.
これらのファイルは,昔 NT サーバなどで管理していたものを NAS に移して運用している.
その後,その NAS 上のものを編集する様になり,更新したものはエラーにはなっていない?
コピーはできているのと,同じコマンドの再実行ではエラーにはならないのでこのままとする.
エラーになったファイルは「作成日時」と「アクセス日時」がコピーしたタイミングに更新されてしまっている.
2024/07/10
改めて調べてみると,コピー元のアクセス日時が正しくない.
::ShellExecute
「インデックスのオプション」を開くために ::ShellExecute などから開けないかと…
検索するとコマンドプロンプトなどで「control.exe /name Microsoft.IndexingOptions」とすれば良いことがわかった.
この動作の cpp のコード.
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 ;
}
void CShellEDlg::OnExecute()
{
UpdateData(TRUE) ;
HINSTANCE hInst = ::ShellExecute(this->GetSafeHwnd(),m_StrOper,m_StrFile,m_StrPara,NULL,SW_SHOW) ;
if (UINT64(hInst) > 32) { return ; }
DWORD error = ::GetLastError() ;
CString str ;
{
str.Format(_T("%d\r\n%d"),DWORD(hInst),error) ;
str += _T(" ") + ::Error_FormatMessage(error) ;
str += _T("\r\n") + m_StrOper ;
str += _T("\r\n") + m_StrFile ;
str += _T("\r\n") + m_StrPara ;
}
AfxMessageBox(str) ;
}
SetWindowPos で最前面に
以前から CWnd::SetWindowPos などを使用してウィンドウを最前面にしているツールがいくつかある.
ほとんどの場合これでうまくいっているが,先日テストしていて最前面に移動しない現象を確認.
2 つの exe があり,A.exe から B.exe を起動している.
B.exe はダイアログベースで,そのウィンドウを A.exe のウィンドウより前面に表示するもの.
Spy++ で見ると最前面に移動できた時は WS_EX_TOPMOST がある.
が,うまくいかない場合には WS_EX_TOPMOST がない状態.
いろいろと操作してみたが,なかなか現象が絞れなかった.
結局は B.exe を起動する時,他のウィンドウにフォーカスが移っている?と,最前面にならないみたい.
B.exe の起動をエクスプローラなどから行い,ウィンドウが表示される前にブラウザなどに切替えると最前面にならない.
今回対象のものは,最前面に移動しなくても問題ないと思われるのでこのままとする.
mfc140ud.dll が見つからない …
「mfc140u.dll が見つからない…」の場合は
Microsoft Visual C++ 再頒布可能パッケージ
VC 2019 でデバッグビルドして実行すると,
—————————
Test.exe – システム エラー
—————————
mfc140ud.dll が見つからないため、コードの実行を続行できません。プログラムを再インストールすると、この問題が解決する可能性があります。
—————————
OK
—————————
ファイル名の所は MSVCP140D.dll などもある.
また exe は VC 2015 以降でデバッグビルドしたもの.
原因はわかっている.先日 VS 2022 のアップデートがあった.
その時 Win11 環境はうまくできたが Win10 環境では何故か失敗したため.
どうしたものか…
「VS Installer」の「VS 2022」で「変更」を選択,そのまま進めるとダウンロード,インストールが始まった.
「修復」の方が良かったみたいだが …
高 DPI 環境での CToolBar
vC 6 MFC プロジェクトを VC 2010 以降に更新すると,高 DPI 環境でツールバーがうまくない.
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 ;
}
ツールバーボタンのビットマップのリサイズはまだ書換えができていない.
https://itl.mish.work/i_Tools/Doc/blog/migrate/Test0603.zip
VC6 から VC2019 への移行
今回は VC 6 ds? の VC 2019 への更新.
VS 2022 では,VC 6 からのアップグレードがなくなった.
VS 2019 で dsw を開き 2019 に更新.
設定は VC 8 の時の手順とほとんど変わらない(設定値が微妙に異なる部分あり).
出力ディレクトリなどを「c:\Temp\…\$(ProjectName)\$(Configuration).142\」に.
「文字セット」を「Unicode 文字セットを使用する」に.
「プリコンパイル済み…」を「$(IntDir)$(TargetName).pch」に.
「C/C++」の「出力ファイル」を「$(IntDir)」に.
「リンカ」の「出力ファイル」を「$(OutDir)$(ProjectName).exe」に.
「ブラウザ情報」の「出力ファイル」を「$(OutDir)$(ProjectName).bsc」に.
そのままビルドすると,デバッグ版では 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 などでも同じように指定することで移行が可能なことを確認.
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」に.
「プリコンパイル済み…」を「$(IntDir)/$(TargetName).pch」に.
「C/C++」の「出力ファイル」を「$(IntDir)/」に.
「リンカ」の「出力ファイル」を「$(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 に.
vC 9 以降に更新する場合は Test.sln を開く.
出力ディレクトリなどを「c:\Temp\…\$(ProjectName)\$(ConfigurationName).090」などに.
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() の呼出しを追加する.
「Windows 検索」設定
Windwos Search の「インデックスのオプション」を開きたいと問い合わせが入った.
以前の Windows であれば「コントロールパネル」から入ると「インデックスのオプション」があった.
Win10 以降?は「コントロールパネル」も簡単には開けない.
Windows の検索ボックスで “インデックスのオプション” と入力すれば良かったのだが…
それが思い出せず,”Windows サーチ” や “Windows 検索” と入力して,うまくたどり着けない.
“Windows Search” と入力しないとうまくないみたい.
「Windows 検索」の「クラッシック」の下の「…検索場所をカスタマイズ…」を選ぶと表示できる.
Windows の設定などは,キーワードを英語で入力する方が良いのかもしれない.
2024/06/19
「スタート」で表示される「検索ボックス」に何か入力すると「…」(オプション メニュー)が表示される.
それを選択すると「インデックス オプション」などがある.
2024/06/20
「インデックス オプション」は次の様なコマンドでも可能なので,::ShellExecute で呼び出す様にした.
control.exe /name Microsoft.IndexingOptions