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() ;
ダイアログベースの時も同様に.
* まだ作成途中です.
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;
}