Win11 コンソール AP で DC
今まで Win10 をメインで使用していたので気づかなかったが…
Win10 でうまく使えていた GDI の描画が Win11 ではうまく行われない?
どうも,デフォルトの設定では新しい「ターミナル」が使用されることによるみたい.
ターミナルの「設定」から入って「Windows コンソール ホスト」を選択して「保存」する.
シンボリックリンクがない?
先日から ZIP を扱うコードを書いている.
いつも exe を作成するのは,VC 6 と VC 2015 以降が多い.
今回は,幾つかの環境(Win7 など)での動作を確認したかったので,VC 9 でビルドしたものもテストしていた.
Win10 環境では特に問題なかったが,Win11 環境でうまく機能しない動作がある.
VC 6 や VC 8 でビルドしたものは OK .また,VC 2015 以降も良さそう.
リリース版とデバッグ版での違いはなさそう.
VC 9 と VC 10 でビルドしたものがうまくないことがわかった.
VC 9 で,デバッガで追いかけていくと,stat の _tsopen_s で見つからないとなってしまう.
VC 8 以前ではその部分はなく,VC 11 以降では _O_OBTAIN_DIR が設定されている.
検索するとシンボリックディレクトリリンクがサポートされていないみたい.
FIX”_stat”または”_wstat”関数が失敗した ENOENT エラーとディレクトリのシンボリック リンクのパスは、Visual C++ 2010 アプリケーションに渡されたとき
Update: “_stat” oder “_wstat”-Funktion nicht mit ENOENT Fehler, wenn ein symbolische Verknüpfung Verzeichnispfad zu Visual C++ 2010 Anwendung übergeben wird
“_stat ファミリ” の関数呼び出しでは、Visual Studio 2013、2012、または 2010 の C ランタイム ライブラリ関数のシンボリック ディレクトリ リンクはサポートされていません
Function calls of “_stat-family” do not support Symbolic Directory Links for C Runtime Library functions from Visual Studio 2013, 2012, or 2010
対応は VC 2015 以降を使用する必要がある?
fatal error C1001
MFC SDI プロジェクトを /clr を有効にして,ビルド.
さらに OpenMP を有効にしてビルドすると …
ビルドを開始しました...
1>------ ビルド開始: プロジェクト: MBPV, 構成: Release Win32 ------
1>MBPVDc.cpp
1>enumfile.hxx MessageBar No Support
1>BDocCSV Draw No Support
1>_WIN32 1
1>_WINDOWS 1
1>_OPENMP 200203
1>_UNICODE 1
1>_MSC_VER 1929
1>_MSC_FULL_VER 192930157
1>_MFC_VER 0x0E00
1>_ATL_VER 0x0E00
1>__CLR_VER 40809290
1>_MSVC_LANG 201402L
1>WINVER 0x0A00
1>__cplusplus_cli 200406L
1>_AFXDLL 1
1>_M_CEE 001
1>_MANAGED 1
1>__DATE__ "Jan 10 2025"
1>__TIME__ "13:39:57"
1>UndoRedo::UpdateUI No Support ODMenu
1>T:\Develop\_.SRC\__CPR_\enumfile.hxx(597): fatal error C1001: 内部コンパイラ エラーが発生しました。
1>(コンパイラ ファイル 'D:\a\_work\1\s\src\vctools\Compiler\Utc\src\p2\main.c'、行 213)
1> この問題を回避するには、上記の場所付近のプログラムを単純化するか変更してください。
1>可能な場合、再現手順をこちらに入力してください: https://developercommunity.visualstudio.com
1>詳細については、Visual C++ ヘルプ メニューのサポート情報コマンドを
1>選択するか、サポート情報ヘルプ ファイルを参照してください
1> CL!RaiseException()+0x62
1> CL!RaiseException()+0x62
1> CL!InvokeCompilerPass()+0xc17f1
1> CL!CloseTypeServerPDB()+0x16cc3
1>プロジェクト "MBPV142.vcxproj" のビルドが終了しました -- 失敗。
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
デバッグビルドは通る.また,/clr や OpenMP を外すと通る.
VC 2017 や 2022 などでは問題ない.
何かの更新で解消されるかもしれないので,このままとする.
MFC + System:: … ::ZipFile
先日から作成しているテスト exe で,ZIP に圧縮する動作を…
主要な exe では,izip.exe を呼出したり,シェルの機能を利用している.
ただ,同期のタイミングなど少し時間がかかるので,試しに直接呼出す方法に変更.
プロジェクトの設定で「共通言語ランタイム サポート (/clr)」に.
そのままビルドすると
cl : コマンド ライン error D8016: コマンド ライン オプション ‘/ZI’ と ‘/clr’ は同時に指定できません
cl : コマンド ライン error D8016: コマンド ライン オプション ‘/clr’ と ‘/Gm’ は同時に指定できません
cl : コマンド ライン error D8016: コマンド ライン オプション ‘/clr’ と ‘/RTC1’ は同時に指定できません
T:\…\zip_CLI.hxx(16,9): fatal error C1107: アセンブリ ‘System.IO.Compression.dll‘ がみつかりませんでした: /AI または LIBPATH 環境変数を使用してアセンブリ検索パスを指定してください。
L:\Document\…\ComPrj01.cpp : fatal error C1128: セクションの数がオブジェクト ファイル形式の制限を超えています: /bigobj と共にコンパイルしてください
「プログラム データベース (/Zi)」に.
/Gm と /RTC1 は「<親またはプロジェクトの既定値から継承>」に.
「追加の #using ディレクトリ」を「C:\Windows\Microsoft.NET\Framework\v4.0.30319」に.
「C/C++」-「コマンド ライン」の「追加のオプション」に「 /bigobj 」の追加.
これでビルドはできる様になったが,あまり見慣れない warning が…
ComPrj01.obj : warning LNK4248: 未解決の typeref トークン (0100001B) (‘_TREEITEM’) です。イメージを実行できません。
ComPrj01.obj : warning LNK4248: 未解決の typeref トークン (0100001F) (‘GLUtesselator’) です。イメージを実行できません。
これに関しては,ちょっとわからず.
error LNK2001: unresolved …
空のコンソール AP プロジェクトを作成して,_tmain を含む cpp を追加してビルドすると
--------------------Configuration: t_MBP - Win32 Debug--------------------
Linking...
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex
c:\Temp\MBP\t_MBP\Debug.060/t_MBP.exe : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.
t_MBP.exe - 3 error(s), 0 warning(s)
この cpp では MFC を使用しているので,「共有 DLL で MFC を使用」に変更する.
Windows SSH サーバ設定
昨日 SSH サーバをインストールして動作する所までを行った.
そのままでは不安があるので,検索すると C:\ProgramData\ssh\sshd_config で設定することがわかった.
sshd_config を編集するためには,メモ帳などを管理者として実行する必要がある.
いろいろとエクスプローラなどで見ていた時,次のフォルダを開いてしまったのがいけなかった.
C:\ProgramData\ssh\logs
原因,対応は次の所と同じ.
WindowsアップデートでOpenSSHが起動しなくなった問題(2024年10月アップデートの影響)
他の PC からの再起動
先日から Win10 PC が突然フリーズする現象が発生する様になった.
仮想メモリの設定を自動にしてからは,画面が突然止まってしまう.
マウスやキーも入らない.「Num Lock」を押してもランプは変わらない.
ディスクアクセスのオレンジのランプはアクセスに応じて点滅している.
他の PC から,共有ファイルなどは見える.
「電源ボタン」で休止状態となる様に設定したが,反応はしない.
NAS を含む Linux であれば,SSH 接続して reboot コマンドなどが使用できる.
検索すると幾つか方法がありそう.
* リモートデスクトップ
* shutdown コマンド
* Power Shell の Restart-Computer コマンド
Windows 系OS で、リモートシャットダウンを設定する
パソコンをリモートでシャットダウンまたは再起動する方法は?
他のコンピュータをシャットダウンまたは再起動する方法
リモートデスクトップでの操作は期待できないが,取りあえず設定した.
コマンドによる操作は,対象 PC 上ではうまく機能するが,別の PC からはうまく機能しない.
SSH 接続でもうまくいかない.
結局 SSH 接続する時のアカウントに管理者権限を与えて,そこから shutdown /r /t 300 とすることでうまくいった.
これで目的を達するかの確認は,次にフリーズした時なのでまだ何とも言えない.
Win11 22H2 の更新
Win11 PC は 22H2 のままで,今日 Windows Update の確認をすると…
「お使いのバージョンの Windows は、サービス終了を迎えました。」となっている.
「更新プログラムのチェック」を行っても特に変わらず.
仮想マシンで Win11 22H2 のものを確認すると,23H2 のインストールが可能になって先程更新できた.
どうしたものかと思ったが,結局 Win11 24H2 の iso でセットアップ中…
1 時間程かかって更新はできた.
サーバへのログオン情報がうまく引き継がれないみたいで,手間取った.
サーバによるのか,手順によるのかわからないが,何度入力してもうまく認識しないサーバがあった.
再起動して,うまくいった.
Shell Extension のデバッグ
ここ 1ヶ月位,共通のコードを分割したり,古いままの部分を改良したりしていた.
ある程度区切りがついたので,ツール関係のプロジェクトからビルドして exe はできる様になった.
それぞれの動作チェックはこれから.
昨日新しいコードでビルドしたものに,「シェルエクステンション」のものがある.
新しいものに置き換えて PC を操作していると,エクスプローラがうまく動作しない.ダウンする.
他の exe で実行しても同様で,イベントビューアを見ると次の様になっている.
障害が発生しているアプリケーション名: DImg.exe、バージョン: 1.0.0.1、タイム スタンプ: 0x4b5822a3
障害が発生しているモジュール名: iShelExt.dll、バージョン: 1.55.2024.8、タイム スタンプ: 0x6751c1dc
例外コード: 0xc000041d
障害オフセット: 0x0004aadc
障害が発生しているプロセス ID: 0x5054
障害が発生しているアプリケーションの開始時刻: 0x01db477a20d02f17
障害が発生しているアプリケーション パス: L:\Document\Develop\Debug\ShellExt\DImg\Release\DImg.exe
障害が発生しているモジュール パス: C:\Users\Public\Documents\Tools\i_Tools\Test\iShelExt.dll
レポート ID: c898b214-2c4e-4701-8c17-27d414c106fb
障害が発生しているパッケージの完全な名前:
障害が発生しているパッケージに関連するアプリケーション ID:
シェルエクステンションでの表示データを求める部分を直接呼出している単体テスト用 exe では問題ない.
これは予想通り.
「開く」ダイアログでシェルエクステンションのテストができるのでコンソール AP を作成.
https://itl.mish.work/i_Tools/Doc/blog/vc/c_sxt.zip
VC 2022 の「デバッグ」-「コマンドライン」で …\c_sxt.exe を指定.
__targv がうまくなかった.DLL の場合は NULL になる?
次の様に修正.
#ifdef _MSC_VER
{
if (G_arg.size() == 0) {
// ::reg_argv(__argc,__targv) ;
if (__targv != NULL) {
for (int index=0 ; index<__argc ; index++) {
tstring av = __targv[index] ;
G_arg.push_back(av) ;
}
}
}
}
#endif
Mouse without Borders
先日,Win11 24H2 で調べていた時に見つけた「Mouse without Borders」.
以前は,切替器を使用していた頃もあったが,最近は VNC 接続にしているで必要なくなっていた.
ただ,一つ問題が… VNC 接続のため?「半角/全角」を切替えた直後のキーがうまく入らない.
Win10 と Win11 のそれぞれに「Mouse without Borders」をインストール.
デフォルトの設定のまま,1 週間ほど使用した.
キーはうまく入ることが確認できた.
時々,ホストのタスクバーの「VS」のアイコンが押されてしまい,VS 2017 や 2019 が起動してしまう.
幾つかの設定を変更して,しばらく様子見.
Let’s Encrypt で証明書が …
Synology NAS で証明書の更新ができなくなってしまった.
mish.dsmynas.com や mish.myqnapcloud.com は自動的に更新されるようになった.
mish.myasustor.com と mish.myds.me は,ルータの設定を一時的に変更して更新できていた.
が,今回はうまくいかない.
「サブジェクトの別名」を指定しなければうまく取得できる.
一度すべて削除して,再度「追加」したらうまく取得できた.
argv envp
以前 Linux 環境で動作する .out で,コマンドラインを取得したくなり作成したコード.
Windows でもそのまま動作する様に作成したもので,予め main でグローバルな変数に argv を登録している.
#include "cmd_line.hxx"
int _tmain (int argc,TCHAR* argv[],TCHAR* envp[])
{
{
::reg_argv(argc,argv,envp) ;
}
{
::dmp_arg() ;
}
return 0 ;
}
Windows の場合は __argc と __argv が利用できるのであまり必要ない.
::GetCommandLine を使用することも可能.
Win11 24H2 対応 ユーザの追加
先日 24H2 をいろいろ調べた時「ゲストログオンを有効にする」ことで対応した.
が,それではセキュリティの問題があるため改めて調べてみた.
それで検索してみたが,わかりやすいページがあまり見つからず,私の環境での設定をまとめた.
画像は仮想マシンで Win10 Home と Win11 Pro 24H2 を用意してのもの.
サーバ側 Win10-Home
「スタート」をクリックして「user」と入力.「他のユーザーの追加、編集、削除」を選択.
「他のユーザー」の「その他のユーザーをこの PC に追加」を選択.
「Microsoft アカウントを持たないユーザーを追加する」をクリック.
共有アクセスするためのユーザー(ここでは “cad” )を追加.この時,必ずパスワードを設定すること.
クライアント側 Win11-24H2
「スタート」をクリックして「shikaku」と入力.「資格情報マネージャー」を選択.
「Windows 資格情報」を選択.「Windows 資格情報の追加」をクリック.
「サーバー名」,「ユーザー名」,「パスワード」を入力して「OK」.
これで \\Win10-Home としてアクセスできる様になる.
コンパイル時の #define 値の表示
次の様なコードをコンパイル時に表示したくなった.
#ifdef _MSC_VER
str = _T("_MSC_VER ") + ::utot(_MSC_VER,10) ;
#endif
std::tout << str ;
以前一度使用しているが,それをもう少しいろいろと...
次の様に _CRT_STRINGIZE とすれば _MSC_VER 1941 と表示される.
#ifdef _MSC_VER
#pragma message ("_MSC_VER " _CRT_STRINGIZE(_MSC_VER) )
#endif
VC 14 以降は vcruntime.h で次の様になっている.
#define _CRT_STRINGIZE_(x) #x
#define _CRT_STRINGIZE(x) _CRT_STRINGIZE_(x)
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 位になった.
VC6 プロジェクトのコードの移行
以前,VC 6 プロジェクトを移行する時の,設定などについて書いた.
VC6 から 2005 , 2008
VC6 から 2010 – 2019
VC6 から 2022
今回は C++ コードの変更などのまとめ.
アプリケーションクラス InitInstance の次の呼出しを削除.
#ifdef _AFXDLL
Enable3dControls();
#else
Enable3dControlsStatic();
#endif
文字や文字列を _T() で括る.
‘A’ –> _T(‘A’)
"abc" –> _T("abc")
_MBCS では問題ないコードが _UNICODE で,CString 変数のポインタが値として解釈されることがある.
その場合は LPCTSTR() で括れば良い.
str –> LPCTSTR(str)
C スタイルの文字列に関連する CString の操作方法
CString⇒LPTSTR変換
文字列操作関数の _UNICODE 対応と _s 対応.
_t で始まる関数に置き換え.また gcc などでも通る様に _tdefine.hxx を用意.
_MSC_VER により,_s 版と以前のものを切替える関数群を用意.
int を INT_PTR などに(x64 対応).
CArray::GetSize など,MFC の色々な所で int が INT_PTR に変更された.
int size = array.GetSize() ; –> INT_PTR size = array.GetSize() ;
ダイアログベースの時も同様に.
sprintf など,可変長引数を使用している部分の修正.
古いコードで使用しているだけなので,#if defined (__cplusplus_cli) で切り分けることにした.
* まだ作成途中です.
Microsoft C/C++ 2003 – 2015 の変更履歴
Visual C++ 移植およびアップグレード ガイド
QNAP NAS 赤ランプ
今日 PC を起動しようとして,その隣の QNAP NAS の一番上の赤いランプが点灯していることに気づいた.
https://download.qnap.com/TechnicalDocument/Storage/SMB%20NAS/ts-x53d/ts-x53d-ug-ja-jp.pdf
ステータスランプが赤く点灯しているだけで,ドライブのランプは緑の点滅.
スマートフォンの管理ツールで見ると,ディスクの空きが少なくなったことによる警告だった.
確かに,空き容量が少なくなったメールは来ていた.
他社 NAS も同様のメール通知の設定していて警告は来るが,赤いランプが点灯するようなことはなかったと思う.
不要なファイルを整理して対応.赤になっていたランプは緑の点灯になった.
リリース版 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
ゲストログオンを有効にしない共有アクセス用のユーザを追加しての対応方法