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
ゲストログオンを有効にしない共有アクセス用のユーザを追加しての対応方法
MFC ダイアログに描画
MFC ダイアログ exe で GDI などでの描画を行うときは,通常「Picture Control」を使用する.
メンバ変数として CStatic を割り当てて,その変数(ウィンドウ)に対して描画する.
CWnd::GetDlgItem や ::GetDlgItem でも良い.
単体テスト用など,それほど重要でないプロジェクトでダイアログに直接描画したい時がある.
リサイズ可能なダイアログの場合,Picture Control のリサイズなども意外と面倒なため.
VC 2022 で,MFC の「ダイアログ ベース」として作成.
ダイアログの基本クラスは「CDialog」とした.
CDlgDrwDlg::OnPaint() の else 部分を次の様に変更.
{
// CDialog::OnPaint();
{
CPaintDC dc(this);
CRect rect;
GetClientRect(&rect);
rect.DeflateRect(10, 10);
dc.Rectangle(rect);
}
}
ダイアログの「プロパティ」-「透明化」は「True」の方が良さそう.
https://itl.mish.work/i_Tools/Doc/blog/vc/DlgDrw.zip
VS 2022 の更新で「問題が…」
VS の更新があったので更新すると…
「申し訳ございません。問題が発生しました」.
どうも VC ランタイムのパッケージがインストールされなかったみたい.
デバッグや通常の実行も問題はなさそう.
前回とは違い「修復」で対応しようと思ったが…
どこまでがリセットされるかわからないので「変更」で対応.
サムネイル表示が止まる?
以前作成したエクスプローラのサムネイル表示.
前からの現象だが,不定期に表示が止まってしまうことがあった.
ほとんどが個人的に作成したシェルエクステンションの影響だが,今回は違ったように思う.
全ての explorer.exe を終了させても改善されない.
再起動すれば良いのはわかっているが,順に exe を終了させることに…
dllhost.exe を終了させると,止まっていた表示が動き出した.
ハッキリしたことがわかってないので,とりあえずメモ.
TryHackMe を使って…
先日「7日間でハッキングをはじめる本」を購入して,その内容をやった.
7日間とはいかず,2週間程度かかってしまった.
20年位前に作成した Web のシステムでは,これらの知識がなかったため幾つか問題があった.
何年か前に修正済みで,そのほとんどが「クロスサイトスクリプティング」だったと思う.
「OSコマンドインジェクション」などは知っていたが,ポートスキャンやパスワードの具体的な部分がわかった.
デフォルトポートの危険性や,パスワードで「数桁の数字」などは意味がないことがよくわかる.
外には公開していないので問題なかったとは思うが
LAN 内の幾つかの機器をポートスキャンしてみると,意図していないものが開いたままのものがあった.
10年位前に追加したもので,設定を間違えたのか,デフォルトで開いていたのか…
2024/10/02
この様な記事を書いたからというわけではないと思うが,昨日から次の様なアクセスが来ている.
//mish.work/?a='>"></script><svg/onload=confirm(1)>&b='>"></script><svg/onload=confirm(2)>&c=...
特に問題ないと思うが,ログが汚くなってしまう.
0x80030002
次の様なエラーになると連絡が…
ファイルのコピー
予期しないエラーのため、ファイルをコピーできません。…
エラー 0x80030002: ***** が見つかりませんでした。
よくある “file not found” とはエラーコードが異なる.
ERROR_FILE_NOT_FOUND 0x00000002
また,更新日時やサイズが表示されているので「ファイルがない」わけではなさそう.
表示されているファイル名は ZIP 圧縮したファイルの一部?
タイトルバーがアプリケーション名などになっていないので,API 呼出しの中などで表示されているか?
0x80030002 は STG_E_FILENOTFOUND .
幾つか心当たりがある操作などを試してみたが,現象は確認できなかった.
その後現象が発生しなくなったとのことで詳細はわからず.とりあえずメモ.
DDX_CBIndex , DDX_CBString
デバッグ用のツールを作成していて,コンボボックスを使いたくなった.
使いたかったのは「ドロップダウン リスト」で,ドロップダウン部分を常に表示した「標準」の状態.
本当はリストボックスを使えば良かったか?
VC6 の「MFC ClassWizard」で変数を追加しようとすると変数のタイプが「CString」.欲しいのは「int」.
コンボボックスのタイプを「ドロップダウン リスト」に変更すると「int」が表示され,DDX_CBIndex が追加できた.
void CSwMLGDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CSwMLGDlg)
DDX_CBIndex(pDX, IDC_LANG_UI, m_LangUI);
DDX_CBIndex(pDX, IDC_LANG_PR, m_LangPR);
//}}AFX_DATA_MAP
}
変数追加後,コンボボックスのタイプを「標準」に変更.
TM103M4 入手
休日など PC を起動するまでもない作業の目的で Android タブレット TM103M4V1 を入手.
他にも NAS に保存した動画が見られれば良いと思っていたが,これは限定的なものとなってしまった.
moto g13 と同様で,BS 放送を DR モードで録画したものがうまく見られない.地デジ放送のものであれば OK .
moto g8 power lite ではうまく見られるので,端末と REC-ON App との相性の問題か?
今回は,スマートフォンなどの情報は引き継がないで設定した.
Google アカウントによるのか,Chrome にはいろいろな情報が引き継がれる.
アプリの作り方によるものと思うが,スマートフォンでは少し面倒と思う部分が幾つか解消されている(PC に近い?).
WebGL 関係の動作として,Three.js はうまく動作しているが SceneJS の方はうまく表示されない.
「ダークモード」で使い始めたが,明るい色が背景前提のアプリがまだまだ多い気がする.
また,このブログもそうだが,ブラウザで見る時明るすぎるため目が疲れる?
スマートフォンのロック解除では「指紋認証」を長く使っているので,ロック解除が意外と面倒に感じる.
表示が消えた状態で,電源ボタンを押して表示させようとして,反応が悪い時や表示できないことがあった.
10 秒以上押しての「強制的な再起動」で対応した.
表示できないことは何度かあり.また,時間を置くと同じ操作で表示されることもあり.
私の使い方であれば,バッテリは 3 日位持ちそう.
同時に注文したキーボード付きのケースが到着.
タブレットを装着して,キーボードもうまくケースに収まるかと思ったが,そうではなかった.
持ち運びを考えると,キーボードがケースに固定できないので使い勝手は良くない.
キーボードに関して,英語と中国語で書かれたものが入っている.
内容は,Bluetooth 接続のキーボードを使ったことがあれば誰もが知っている程度のもの.
Android ,Windows ,iOS の表記があるので接続先を変えられそうだがよくわからない.
キーボード単体としては次のものが近いと思われる.
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 ;
}
VC6 から VC2022 への移行
VC 6 から 2022 へのアップグレードがなくなったので,手動での移行方法を試してみた.
VC6 から 2005 , 2008
VC6 から 2010 – 2019
「新しいプロジェクトの作成」で「空のプロジェクト」を選択して「次へ」
適当なプロジェクト名を付けて「作成」.
必要に応じて,VC 6 プロジェクトのファイルをコピー.
「ソリューション エクスプローラー」のプロジェクトを「右クリック」-「追加」-「既存の項目」.
cpp,h,rc を選択して「追加」.
必要に応じて「出力ディレクトリ」などの指定.
「共有 DLL で MFC を使う」に.
「_CONSOLE」を「_WINDOWS」に.
「Windows(/SUBSYSTEM:WINDOWS)」に.
ヘッダーファイルを追加していないと「クラス ウィザード」がうまく機能しない.
以下は,正しく設定されていない場合のエラー.
C:\...\afx.h(24,1): error C1189: #error: Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version. Please #define _AFXDLL or do not use /MD[d]
「スタティック ライブラリで MFC を使用する」または「共有 DLL で MFC を使う」に.
libcmtd.lib(exe_main.obj) : error LNK2019: 未解決の外部シンボル _main が関数 "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ) で参照されました
「Windows (/SUBSYSTEM:WINDOWS)」に.
クラス ウィザードで CAboutDlg のみ.
ソリューションに *.h を追加する.
* 他の動作はまだ確認中です.
「バージョン情報」ダイアログ
バージョンリソースを読み込み「バージョン情報」ダイアログの表示で使用するコード.
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 では変更できなかった.
FBX SDK 2020.3.7
FBX SDK のダウンロードページを見ると 2020.3.7 があった.
インストールしてみると,今までと lib 以下が異なる.
2020.3.4 までは VS のバージョンでわかれていたのに,今回は lib\x64\debug\ などになっている.
ビルドしてのテストなどはまた今度落ち着いた時に …
設定などは次の所に書いています.
https://jml.mish.work/index.php/cpp/fbx-sdk-setting.html
FBX Review は exe が置いてあった.
Autodesk FBX Review – Windows 64 Bit
QNAP AI Core 3.4.1
先日から QNAP NAS のパッケージのアップデートがある.
幾つかは問題なく更新できるのに AI Core 3.4.0 のみが更新に失敗する.
今までは特に問題なく更新できていた(関連するものは自動で更新されていた)のに…
イベントログを見ると,次の様になっている.
エラー 2024-06-29 18:35:45 Iwao 192.168.1.xx Qmanager Qmanager/2... App Center App Installation [App Center] Failed to install QuMagieCore. You must first install container-station.
エラー 2024-07-09 15:58:59 Iwao 192.168.1.xx Web Desktop Mozilla/5.0 App Center App Installation [App Center] Failed to install QuMagieCore. You must first install container-station.
どうも Container Station を先に更新しないといけないみたい.
Container Station を更新してから AI Core の更新でうまくいった.