2025年2月
 1
2345678
9101112131415
16171819202122
232425262728  

カテゴリー

アーカイブ

ブログ統計情報

  • 106,207 アクセス


CWinApp::m_pszAppName

今更の内容ではあるが…
MFC の SDI や MDI で,アプリケーション名は,作成したプロジェクト名?になる.
ダイアログベースで作成した場合は exe 名になってしまう.
困ることがあるのが exe 名を変更した場合のレジストリキー.


CWinApp::m_pszAppName はヘルプにある様に,AFX_IDS_APP_TITLE がなければ exe 名となる.
CWinApp:: m_pszAppName
コードは MFC 6 のものだが,MFC 14.3 でも同様.
CWinApp::SetRegistryKey で m_pszAppName を利用している.
exe 名と異なるものを使用する場合,リソースの AFX_IDS_APP_TITLE を変更するか,なければ追加すれば良い.

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

VC 2022 ビルドでエラー

VC 2022 でビルドしようとすると,次の様なエラー.
—————————
Microsoft Visual Studio
—————————
オブジェクト参照がオブジェクト インスタンスに設定されていません。
—————————
OK
—————————
オブジェクト参照がオブジェクト インスタンスに設定されていません。
プロジェクトの設定などを見直しても特に怪しい部分はなさそう.
ビルド時に生成される幾つかのファイルを手動で削除しても特に変わらない.


さっきまで動作していた VC 2019 も同様のエラーに.
以前うまく動作しているはずのプロジェクトをコピーして,ビルドしようとしても同様.
こうなると,プロジェクトの設定ではなく,環境っぽい.


PC を再起動してうまく動作する様になった.

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

…\System32\MicrosoftEdgeCP.exe

…\System32\MicrosoftEdgeCP.exe が存在するのに,stat などでうまく読み取れない.


ファイルが存在しているかどうかをチェックするために,CFileStatus などを利用している.
CFileStatus::GetStatus() で,幾つかのファイルが正しくチェックできない.
コードをデバッガで追いかけていくと,::FindFirstFile で INVALID_HANDLE_VALUE となってしまう.
検索 すると次の様なものがあった.
FindFirstFile関数はx64環境においてシステムファイルが検索できない?
x86 の場合次のものを呼出して切替える必要があるみたい.
Wow64DisableWow64FsRedirection
Wow64RevertWow64FsRedirection
File System Redirector
FindFirstFile ... INVALID_HANDLE_VALUE


今回 ::GetFileVersionInfo から始まって いろいろとあったのでメモ.

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

VC 14 以降での stat.c の場所

VC 14 以降,<sys/stat.h> 関係が大きく変更されている?
CFileStatus でアサート


今回 stat 関数内をデバッグしようとしていて,ソースの場所がすぐにわからなかった.

#ifdef		_MSC_VER
#define		s_stat		struct	_stati64
#define		TSTAT		_tstati64
#else
#define		s_stat		struct	stat
#define		TSTAT		stat
#endif

VC 12 以前は,(VS)\VC\crt\src\ 以下に存在する.


VC で,#include <sys/stat.h> としている所を「右クリック」-「ドキュメント<sys/stat.h>を開く」.
その位置を幾つか上に行って,Include の並びに Source があり,その対応する所に存在する.
VC 14 以降の C ランタイムのソースの場所
VC 2015 以降のどれかで対応がつくと,それ以外でも対応したもの(10.0.?????.0)が開かれる?


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

NAS OpenVPN サーバ設定

以前 ASUS ルータ設定 したが,最近安定しないので NAS で設定した.
OpenVPN の設定手順は次の様なもの.
1. VPN サーバで OpenVPN の有効化と設定.
2. .ovpn ファイルの出力.
3. .ovpn ファイルの編集.
4. OpenVPN が NAS に到達できる様に,ルータやファイアウォールを設定.
5. OpenVPN クライアント で .ovpn ファイルを取り込み.
6. クライアントから「接続」.


Synology NAS
「パッケージセンター」で「VPN Server」を「インストール」.
Synology NAS VPN Server
追加された「VPN Server」を起動.
「OpenVPN」を選んで「OpenVPN サーバーを有効にする」にチェック.
この時「ポート」は「1194」から変更(例えば 51234 )して,「適用」.
Synology NAS OpenVPN 設定
これで「エクスポート設定」が押せるようになる.
出力した .ovpn を「メモ帳」などで開いて編集.
先頭の方にある次の行の「YOUR_SERVER_IP」を変更.
remote YOUR_SERVER_IP 51234
remote 27.92.xxx.xxx 51234
DDNS を使用している場合は xxx.myds.me などの指定も可能.
Synology NAS  .ovpn ファイル
私の場合,動作確認のために 192.168.0.xxx の .ovpn も用意している.
OpenVPN  スマートフォンで .ovpn の取り込み
OpenVPN クライアントでの接続時の「ユーザ名」などは,NAS のユーザ情報が利用される.
ルータのポートの設定は次の様なものを追加.
Synology NAS  OpenVPN  ポートマッピング


ASUSTOR NAS
「App Central」で「VPN Server」を「インストール」.
ASUSTOR NAS  VPN Server
「VPN Server」を起動して「OpenVPN」を「ON」に.
「権限」で「ユーザー」を「追加」,「適用」.
「設定」-「OpenVPN」で「ポート」などを変更し「構成ファイルのダウンロード」.
ASUSTOR NAS  OpenVPN 設定
.ovpn 内の OPENVPN_SERVER_IP を変更.
後は同様に OpenVPN クライアントで取り込めば良い.


QNAP NAS
「App Center」で「QVPN Service」を「インストール」.
QNAP NAS  QVPN Service
「QVPN Service 3」を開いて「OpenVPN」の設定.
QNAP NAS OpenVPN 設定
「設定ファイルのダウンロード」したファイルを OpenVPN クライアントへ.


2023/01/29
Synology NAS で「サーバーCNを認証」にチェックを入れているとエラーになることがある様です.
Android から Synology VPN Server に接続できない

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

::GetFileVersionInfo

以前から使用している FileVer.?xx が MFC に依存しているので,その書き直し.


Win8 の頃だったと思うが,OS のバージョンの取得方法が面倒になった.
システム バージョンの取得
オペレーティング システムのバージョン
欲しいのは動作 OS のバージョン文字列なので WinVer.exe などから取得する様にしていた.


で,書き換えようと思って調べていると…
exe のプロパティで表示されるファイルバージョンと異なることに気付いた.
where.exe のバージョン情報
::GetFileVersionInfo で取得すると次の文字列が返ってくる.
10.0.19041.1826 (WinBuild.160101.0800)


次の様なコードを書いて ::GetFileVersionInfo で返されるものをダンプ.

{
	DWORD	VerHandle   = 0 ;
	DWORD	VerInfoSize = 0 ;
	v_char	VerData ;
	VerInfoSize = ::GetFileVersionInfoSize(LPTSTR(file.c_str()),&VerHandle) ;
	VerData.resize(VerInfoSize*2) ;
	if (::GetFileVersionInfo(LPTSTR(file.c_str()),VerHandle,VerInfoSize,&VerData[0])) {
		tstring	tmp_path = ::Get_i_Tools_tmp_date() ;
		tstring	tmp_name = ::Path_AddLastSP(tmp_path) + ::Path_GetName(file) + _T(".dmp") ;
		::v_c_Save(tmp_name.c_str(),VerData) ;
		}
	}

::GetFileVersionInfo で返されるデータのダンプ


ファイルバージョンの取得.

{
	/*
		VS_VERSION_INFO VERSIONINFO
		 FILEVERSION 1,53,2022,1
		 PRODUCTVERSION 1,53,2022,1
		 FILEFLAGSMASK 0x3fL
		#ifdef _DEBUG
		 FILEFLAGS 0x1L
		#else
		 FILEFLAGS 0x0L
		#endif
		 FILEOS 0x4L
		 FILETYPE 0x1L
		 FILESUBTYPE 0x0L
		BEGIN
		    BLOCK "StringFileInfo"
		    BEGIN
		        BLOCK "041104b0"
		        BEGIN
		            VALUE "Comments", "\0"
		            VALUE "CompanyName", "\0"
		            VALUE "FileDescription", "3D Viewer\0"
		            VALUE "FileVersion", "1, 53, 2022, 1\0"
		            VALUE "InternalName", "i3DV\0"
		            VALUE "LegalCopyright", "Copyright (C) 2013-2022  I. Nakagawa\0"
		            VALUE "LegalTrademarks", "\0"
		            VALUE "OriginalFilename", "i3DV.exe\0"
		            VALUE "PrivateBuild", "\0"
		            VALUE "ProductName", "i_Tools\0"
		            VALUE "ProductVersion", "1, 53, 2022, 1\0"
		            VALUE "SpecialBuild", "\0"
		        END
		    END
		    BLOCK "VarFileInfo"
		    BEGIN
		        VALUE "Translation", 0x411, 1200
		    END
		END
	*/
	tstring	StringFileInfo ;
	{
		struct	LANGANDCODEPAGE	{
			WORD	wLanguage ;		//	0x411
			WORD	wCodePage ;		//	1200	0x4b0
			}	*lpTranslate	= NULL ;
		UINT	lenT = 0 ;
		if (::VerQueryValue(&VerData[0],_T("\\VarFileInfo\\Translation"),(void**)&lpTranslate,&lenT)) {
			tstring	lang_cp_str =	::u32to0t(lpTranslate->wLanguage,16,4) +
			                     	::u32to0t(lpTranslate->wCodePage,16,4) ;		//	"041104b0"
			StringFileInfo = _T("\\StringFileInfo\\") + lang_cp_str + _T("\\") ;
			}
		}
	{
		UINT	lenFV = 0 ;
		TCHAR*	lpFV  = NULL ;
		tstring	name  = _T("FileVersion") ;
		if (::VerQueryValue(&VerData[0],LPTSTR((StringFileInfo+name).c_str()),(void**)&lpFV,&lenFV)) {
			std::terr << lpFV	<<	std::endl ;
			}
		}
	}

FVersion.hxx

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

QNAP NAS Notes Station 3

Twitter を見ていたら「Notes Station」というものがあった.
QNAP NAS Notes Station
Synology NAS の「Note Station」と似た様なものと思われる.

インストール方法などは次の所.
https://www.qnap.com/ja-jp/how-to/tutorial/article/notes-station-3
Edge に Notes Station 3 Clipper を追加.
PC からだと次の様な指定でアクセスできる.
http://(QNAP NAS):8080/ns/
スマートフォン用は Qnote3


https://jml.mish.work/index.php/various/nas.html

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

ADM 4.1.0.RJ52 の更新で …

ASUSTOR NAS の ADM 4.0 から 4.1 への更新で?,Web サーバなどが動作しなくなった.
「Web Center」で「Web サーバー」を設定.
ADM 4.1  「Webサーバー」の設定
これで //as.mish.work/ でアクセスできるようにはなった.


が,WordPressJoomla! がうまく動作していない.
「Apache HTTP Server」に切替えれば良いものと思うが,エラーになってしまう.
ADM 4.1  Webサーバー  「Apache HTTP Server」でエラー


WordPress は,それぞれの記事の表示で「404 Not Found」となっていまう.
Joomla! は「グローバル設定」-「SEO設定」-「フレンドリURL」を「いいえ」で動作する様にはなる.
どこかの設定が足りないものと思うが,ちょっとわからないのでこのままとする.


「保存」した VirtualBox の環境が起動できない.
ADM 4.1  保存した VirtualBox 環境が起動しなくなった
「保存状態を破棄」して起動できた.


夜になって,ADM 4.1.0.RJ72 がリリースされている.
更新後,「Apache HTTP Server」を指定できることを確認.
WordPress と Joomla! はうまく機能する様になった.
ファームの不具合だった?


更新して,今度は VirtualBox に入れなくなってしまった.
ADM 4.1  VirtualBox にログインできない
Linux Center は問題なさそう.


2022/07/13
ADM 4.1.0.RJD1 があった.
更新して,起動できる様になったことを確認.
ADM 4.1  VirtualBox 起動できる様になった

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

VC 2019 以降の include

%LOCALAPPDATA%\Microsoft\MSBuild\v4.0\Microsoft.Cpp.Win32.user.props がないとの問い合わせが…


次の所は以前まとめたもの.VC 2010 以降は,これが引き継がれるものと思っていた.
VC include lib のパス
私の環境の VC 2022 で確認すると,ちゃんと引き継がれている.
VC 2022 プロパティ マネージャー
検索すると VC 2019 から Microsoft.Cpp.Win32.user.props は使用されなくなった?
Microsoft.Cpp.Win32.user.props file missing
Visual Studio プロジェクトの設定を共有または再利用する


今の所は Win32 のみなので,また今度時間がある時に調べる.
VC Linux の include 設定


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

MFC OnUpdate… が来ない?

自前の Doc::UpdateCommand で CCmdUI の処理を実装して,イベントが来なかった.
MFC OnUpdate... が来ない
原因は,範囲の指定が間違っていた.
ON_UPDATE_COMMAND_UI_RANGE (ID_Start, ID_End, OnUpdateCmd)
すぐに気づかなかったのでメモ.

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

vector<long> などを文字列に

std::vector<long> の文字列への変換.
何年も前に書いたコードで,使い方を忘れているのでそのまとめ.


次の様な関数を用意している.
template <class VX> tstring Vx_To_tstring(const VX& vx,LPCTSTR sp=_T(" "))
vxx_tstr.hxx  ::Vx_To_tstring
次の様な使い方で long の配列を文字列へ変換できる.
tstring vl_str = ::Vx_To_tstring<v_long>(long_ary) ;


クラスの配列のダンプ

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

ツールバーのコマンドが効かない

ある AP の動作で,ツールバーの一部のコマンドが入らない.
ツールバーのコマンドが効かない
いろいろと確認すると,x64 exe で,リリース版,デバッグ版は関係ない.
x86 exe は問題ない(ちゃんと機能する).
2015/11 の exe でも同様の現象を確認.
メニューの同様のコマンドは問題ない.


ツールバーがちらつくので,UPDATE_COMMAND_UI の実装でうまくない部分があると思われる.
一時的に Disable にしているなど…


調べるのに時間がかかりそうなので,取りあえずメモ.
状態により,次の矛盾したものが呼ばれることがあったため修正.
pCmdUI->Enable(FALSE) ;
pCmdUI->Enable(TRUE) ;

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

WordPress のバックアップ

Twitter を見ていたら,次の様なものがあった.
QNAPはWordPressを対象に、ライセンスフリーでオールインワンのバックアップソリューションを発表
QNAPはWordPressを対象に、ライセンスフリーでオールインワンのバックアップソリューションを発表
チュートリアルを見ると,WordPress のプラグインと MARS と言う NAS アプリを使うみたい.
How to Back up and Restore a WordPress Website Using Multi- Application Recovery Service (MARS)?


先ず,プラグインをインストールして「有効化」.
WordPress プラグイン QNAP NAS Backup


QNAP NAS に MARS をインストール.
QNAP NAS に MARS をインストール


WordPress の「QNAP Backup」で表示される「AccessKey」を「コピー」.
MARS の「アプリケーション」-「WordPress」で「サービスの追加」.
MARS の「アプリケーション」-「WordPress」で「サービスの追加」


MARS の「バックアップ」で「バックアップジョブの作成」.
MARS の「バックアップ」で「バックアップジョブの作成」
「今すぐバックアップ」でバックアップが始まる.


ログを見ると「成功」にはなっているが,転送サイズが 656 Byte なので,うまく動作していない?
QNAP NAS MARS  バックアップ結果


ここを同じ様にやってみたら,うまくバックアップはできたと思われる.
//dev.mish.work/wordpress のバックアップ結果

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

DS116 entware

localtime が正しく求められない ままの環境.
https://jml.mish.work/index.php/various/nas/synology-nas.html
ある程度 DS220+ に移行したので,SSH 接続環境の再設定.


CLI コマンドの導入.
DS220+ と同様
名前 :「SynoCommunity」
場所 :「https://packages.synocommunity.com/」
「SynoCli File Tools」をインストールして tree , mc , nano などを追加.
これで追加した tree は,localtime が正しく求められている.
DS116  tree -D


Entware のインストール.
Install on Synology NAS

Iwao@DS116:~$ sudo -i
Password:
root@DS116:~# mkdir -p /volume1/@Entware/opt
root@DS116:~# rm -rf /opt
root@DS116:~# mkdir /opt
root@DS116:~# mount -o bind "/volume1/@Entware/opt" /opt
root@DS116:~# uname -m
armv7l
root@DS116:~# wget -O - https://bin.entware.net/armv7sf-k3.2/installer/generic.sh | /bin/sh
--2022-06-15 14:51:04--  https://bin.entware.net/armv7sf-k3.2/installer/generic.sh

DS116  wget entware
ここまでで localtime はうまく求まる様になった.


タスクスケジューラの登録.
「作成」-「トリガーされたタスク」-「ユーザー指定のスクリプト」.
「Entware」「root」「ブートアップ」を指定.
「タスク設定」タブのスクリプトを記述するの所に,貼り付け.
NAS を再起動.


gcc のインストール.

Iwao@DS116:~$ sudo -i
root@DS116:~# opkg update
Downloading http://bin.entware.net/armv7sf-k3.2/Packages.gz
Updated list of available packages in /opt/var/opkg-lists/entware
root@DS116:~# opkg install gcc
Installing gcc (7.4.0-7) to root...

DS116  gcc インストール

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

TS-253D SSL 証明書の更新

DS220+ を追加 して,その後いろいろと設定を変更したためか,TS-253D の証明書がうまく更新されない.
「コントロールパネル」-「セキュリティ」-「SSL 証明書…」-「証明書更新」でエラーになる.
原因は,以前「代替名」で指定していた jml.mish.work などがうまくなかったものと思われる.
現在 jml.mish.work は DS220+ の方に割り当てている.


もう一度,「証明書の交換」から入って,次の様に指定することで取得できた.
TS-253D  Let's Encrypt


同様に AS5202T の方も…
AS5202T  Let's Encrypt  エラー
こちらの場合は一度削除する必要があった.
AS5202T  Let's Encrypt


2022/06/13
Synology NAS DS116 は,まだ完全に移行できていないので,ポートマッピングの設定を一時的に変更して取得.
DS116  Let's Encrypt
ポートマッピング
次の画像は「既存の認証を書き換えます」としたもの.
Synology NAS Let's Encrypt 「サブジェクトの別名」の指定の間違い
「サブジェクトの指定の別名」での区切り文字(セミコロン)が間違っているため,「完了」が押せない.


あとは,それぞれの証明書をエクスポートして,リーバースプロキシを設定したサーバでインポート.
DS220+ ASUSTOR NAS の証明書のインポート

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

Win.ini [Mail] MAPI=1

Win.ini がなくて MAPI が動作しなかった(Disable だった)と報告を受けた.


4 年位前に書き直した MAPI を使用したコードではチェックしない様にしたが,古いコードもまだ存在する.
それらのコードは MFC のコード docmapi.cpp を参考にしたもの.
VC 2022 のコードを見ると,Win.ini の [MAIL] の MAPI をチェックしている.
docmapi.cpp  ::GetProfileInt(_T("MAIL"), _T("MAPI"), 0)
最初のコードを書いた 20 年以上前(VC 98)とそれほど変わっていない.


何もインストールしていない環境で Win.ini は存在する?
Win10 Pro 21H2 では次のものが存在している.
Win10 Pro 21H2  win.ini
何かをアンインストールすると削除されることがあるのか?

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

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

自分で作成した 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.

Joomla! デジタル署名の期限切れ?

QNAP NAS で,アプリのデジタル署名の期限切れのメッセージ.
QNAP NAS  メッセージ: [App Center] アプリのデジタル署名の期限が切れました。Joomla
どうも Joomla! の期限が 2022/05/20 までになっているみたい.
QNAP NAS  Joomla! デジタル署名の期限が切れています。
Joomla! でのパッケージは更新してるのに…
実際動作しているものは 3.10.9 になっている.
どこかに書かれている情報が更新されていないだけか?
よくわからないのでこのまま放置.

Is this 投稿 useful? Useful Useless 0 of 1 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.