Iwao Dev

気付いたことをメモしています.

この画面は、簡易表示です

MFC コントロールのサブクラス化

今まで CWnd::SubclassDlgItem を使ってきたが,DDX_Control も同じ様なことをしているのではと思い調べてみた.


リストボックスをサブクラス化した時の OnInitDialog でのコード.

{
	m_CtrlListFolder.SubclassDlgItem(IDC_LIST_FOLDER,this) ;
	m_CtrlListFolder.Init() ;
	m_CtrlListFolder.ResetContent() ;
	m_CtrlListFolder.SetItemHeight(30) ;
	}

Inside Visual C++ や MFC による Windows 95 プログラミング を参考にしたと思う.
DDX_Control
MFC のバージョンが上がると少しずつ変更が加わっている.
ソースは DlgData.cpp .VC 11 からは WinCore2.cpp .
MFC のソースは難しい.


かなり前の MSDN で次の内容を見つけた.
[MSVC] MFC を使用しての動的サブクラス化
[MSVC] MFC を使用しての動的サブクラス化
DDX_Control でもいけそうな気もするが,…

テクニカル ノート 14:カスタム コントロール

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。


C++ 継承でのエラー C2660

元々一つのクラスとしていたが,それを分割した時のエラー対応のメモ.

bool	D_Image::Draw	(HDC hdc,const RECT rect)
{
	if (GetDocPath().empty())		{	return	false ;		}
	{
		if (::Path_GetExtLow(GetDocPath()) == _T("emf")) {
			return	E_MetaF::Play(hdc,GetDocPath().c_str(),rect) ;
			}
		}
	if (HBMP == NULL && HICN == NULL) {
	//	...
		}
	if	(HBMP != NULL)	{	return	::Bitmap_Draw(hdc,rect,HBMP) ;	}
	else if	(HICN != NULL)	{	return	::Icon_Draw  (hdc,rect,HICN) ;	}
	return	false ;
	}
bool	D_Image::Draw	(HWND hwnd)
{
	if (GetDocPath().empty())		{	return	false ;		}
	if (hwnd == NULL)			{	return	false ;		}
	RECT	rect = {	0	} ;
	::GetClientRect(hwnd,&rect) ;
	bool	result = false ;
	{
		HDC		hdc  = ::GetDC(hwnd) ;
		result = Draw(hdc,rect) ;
		::ReleaseDC(hwnd,hdc) ;
		}
	return	result ;
	}

この E_MetaF::Play の部分を分離.

class	D_I_E	:	public		D_Image		{
public:
	virtual	bool	Draw		(HDC  hdc,const RECT rect)	{
		if (GetDocPath().empty())	{	return	false ;		}
		{
			if (::Path_GetExtLow(GetDocPath()) == _T("emf")) {
				return	E_MetaF::Play(hdc,GetDocPath().c_str(),rect) ;
				}
			}
		return	D_Image::Draw(hdc,rect) ;
		}
	} ;

この状態で変数の宣言を D_I_E として呼び出している所でエラー.

		Sel_doc.Draw(this->GetSafeHwnd()) ;
	//	Sel_doc.D_Image::Draw(this->GetSafeHwnd()) ;
--------------------構成: T_DImage - Win32 Debug--------------------
コンパイル中...
T_DI_Dlg.cpp
\\TestXP\Documents\Develop\VC_Test\Test\etc\EnhMetaF\T_DImage\T_DI_Dlg.cpp(186) : error C2660: 'Draw' : 関数が不正な 1 個の実引数をともなって呼び出されました。
cl.exe の実行エラー
T_DImage.exe - エラー 1、警告 0

下の様に修飾すれば通る.
また,D_I_E の関数として次のものを用意すれば D_Image:: の様に修飾しなくても大丈夫.

	virtual	bool	Draw		(HWND hwnd)	{
		return	D_Image::Draw(hwnd) ;
		}

変更の内容にもよるが,
なるべく既存のコード(呼び出している部分)の変更が最小限となる方が良いか?
C++ 継承でのエラー

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。


構造体の初期化

幾つかの Windows API を呼び出す所を書き換えていて,
RECT や POINT の構造体の初期化で色々と気になり少し調べたことのまとめ.


class として書く場合は,コンストラクタで初期化しているので意識しない.

struct	Vector2	{
//	Vector2	()					{}
	Vector2	(T v=0)		: x(v),	y(v)		{}
	Vector2	(T x, T y)	: x(x),	y(y)		{}
//	...
	T	x ;
	T	y ;
	} ;

MFC を使用している時も同様.

	CRect	rect(0,0,0,0) ;

他の Win32 の構造体だと

	MEMORYSTATUSEX	memStat ;
	memset(&memStat,0,sizeof(MEMORYSTATUSEX)) ;
	memStat.dwLength= sizeof(MEMORYSTATUSEX) ;
	::GlobalMemoryStatusEx(&memStat) ;

Windows では ::ZeroMemory を使っていることもあり.

#define ZeroMemory(pb,cb)           memset((pb),0,(cb))

これまで RECT を 0 にする場合,次の様にも書いていた.

	RECT	rect = { 0,0,0,0 } ;

次の様に省略する方法もあるのは知っていたがあまり使っていない.

	RECT	rect = { 0 } ;

K & R 2nd の A8.7 に書かれている.
Web で検索すると ” RECT rect = { } ; ” の様な記述もあったが,これはどうかと…


構造体のコピーや戻り値は悩む所.
RECT の様な単純な構造では特に問題ないと思う.
XML などのツリー構造の場合はデータにより時間がかかるので注意が必要.


2020/10/13
次の様なコードで動作を確認.

struct	strct_c	{
	i__8	i1 ;
	i_32	i4 ;
	i_16	i2 ;
	i_64	i8 ;
	} ;

bool	test_struct	(void)
{
	strct_a	sa_rn ;
	strct_b	sb_rn ;
	strct_c	sc_rn ;
	strct_a	sa_f0 = {1,2,3,4} ;
	strct_b	sb_f0 = {1,2,3,4} ;
	strct_c	sc_f0 = {1,2,3,4} ;
	strct_a	sa__0 = {0} ;
	strct_b	sb__0 = {0} ;
	strct_c	sc__0 = {0} ;
	strct_a	sa_m0 ;	memset(&sa_m0,0,sizeof(sa_m0)) ;
	strct_b	sb_m0 ;	memset(&sb_m0,0,sizeof(sb_m0)) ;
	strct_c	sc_m0 ;	memset(&sc_m0,0,sizeof(sc_m0)) ;
	::dump_mem(&sc_rn,sizeof(sc_rn)) ;
	::dump_mem(&sc_f0,sizeof(sc_f0)) ;
	::dump_mem(&sc__0,sizeof(sc__0)) ;
	::dump_mem(&sc_m0,sizeof(sc_m0)) ;
	return	true ;
	}

構造体の初期化 VC6
構造体の初期化 ASUSTOR NAS AS5202T
ある程度は予想通り…
パディング部分の扱いが異なるのでコードによっては注意が必要.

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。


TS-253D 再セットアップ – 6

今日 QTS を起動すると,更新版があると表示が…
メッセージに従い操作すると何故か更新できない.
QNAP ファームウェア更新エラー
Qfinder やスマートフォンから操作しても更新できない.
他にも,先日から Ubuntu Linux Station の更新がうまくできなくなっている.


これらがうまく機能しなくなったのは先週くらい?から.
閉じた LAN 用にスイッチングハブを追加してそこに接続したのが影響している?
試しに LAN ケーブルを外して更新すると通った.
同様に Ubuntu Linux Station も更新できた.
QNAP Ubuntu Linux Station インストール


2020/10/05
記事を書いた時は設定場所がわからなかった.
「ネットワーク」-「インターフェース」の中に「システムの既定のゲートウェイ」がある.
開いた設定画面で LAN 1 に設定.
QNAP デフォルトゲートウェイの設定

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。


コンソール AP での define

コンソール AP で Windows.h や Afx.h を読み込んだ時のエラーに対応するために i_def_aw.hxx を用意.
_AFXDLL で判断しているため「MFC のスタティックライブラリを使用」には対応できない.

//	(VS8)\VC\AtlMFC\Include\AfxV_W32.h 
#ifdef			_MSC_VER
	#ifdef		_UNICODE
		#ifndef	 UNICODE
		#define	 UNICODE		// UNICODE is used by Windows headers
		#endif
	#endif
	#ifdef		 UNICODE
		#ifndef	_UNICODE
		#define	_UNICODE		// _UNICODE is used by C-runtime/MFC headers
		#endif
	#endif
#endif

#ifdef			 _MSC_VER
	#ifdef		 _AFXDLL
		#include <Afx.h>
	#else
		#include <Windows.h>
	#endif
#endif

#ifdef			_MFC_VER
	//		...
#endif

i_def_aw.hxx
i_def_aw.hxx 2020/09

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。


NAS VirtualBox に Win10 … 続き

今日 ASUSTOR NAS AS5202T の ADM を起動すると VirtualBox の更新版があった.
新しいものは 6.1.12.r01 .以前のものは 5.2.22 だったと思う.


以前 PC で作成した vdi を NAS にコピーして利用している環境 DevX .
5.2 の時よりも起動は安定したか?止まってしまうこともあり.


前回,インストールしようとしたが操作ができずそのままとなっていた.
VirtualBox の更新でどこかの設定が変更されたのかはわからないが,以前選択できなかった「リモートデスクトップ」の設定に入れるようになった.
ASUSTOR NAS VirtualBox 「リモートデスクトップ」設定
Win10 PC の「リモートデスクトップ接続」で接続してインストール.
ASUSTOR NAS リモートデスクトップ接続
いつもの様に進めていくと「Microsoftアカウント」の入力に.
Win10 LTSC 2019 「ローカルアカウント」の入力に
「代わりにドメインに参加する」を選択すると「ローカルアカウント」での入力ができた.

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。


Joomla! の URL

Joomla! のページで,今まで URL に Joomla! が管理している ID が付加されていた.
特に困ってはなかったが,他の NAS に移行すると ID が変わってしまうみたいなので調べてみた.
検索してもなかなかいい情報がヒットしない.
それで見つけたのが次の所.
Joomlaの新しいSEF URL(パーマリンク)
Joomla! の URL の ID を削除する設定
「記事:オプション」の「ルーティング」の所を「モダン」を選択して「URLからIDを削除する」を「はい」に.


Joomla! は,インデックスされるまで 404 となってしまう.
そのため一部のページは次の様なファイルを置くことで対応.
https://mish.myds.me/joomla/cpp/ref-vcredist-xxx-exe.html

<!DOCTYPE html>
<html	lang="ja"	>
	<head	>
		<meta	charset="UTF-8"	/>
		<meta	name="viewport"	content="width=device-width,initial-scale=1.0"	/>
		<title	>vcredist</title>
		<meta	http-equiv="refresh"	content="0;url=/joomla/cpp/ref-vcredist-xxx-exe.html">
		</head>
	<body	>
		</body>
	</html>

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。


TS-253D 再セットアップ – 5

外からアクセスすることはないが,念のため…
QTS に入るためのポートを変更.
QNAP QTS システムポート
Synology NAS では次の所に書かれている.
Synology NAS のセキュリティを強化する方法
QNAP NAS で書かれていた所.
ワンランク上のセキュリティ対策を施す「myQNAPcloud」


Linux Station のインストール.
QNAP Linux Station
続いて Ubuntu のインストール.
QNAP Ubuntu Linux Station のインストール
右の真ん中辺りの http://…/linux-station-vnc/ をクリックして起動できる.
QNAP Ubuntu 20.04 起動画面
QNAP Ubuntu 20.04


そのままだと英語なので,日本語のインストール.
「Settings」-「Region & Language」-「Manage installed Languages」.
Ubuntu 言語設定
「Install / Remove Languages…」.
Ubuntu 日本語のインストール
「Japanese」にチェックを付けて「Apply」.
どこかに設定があるのかもしれないが,インストールされた「日本語」を選べないので再ログイン.
Ubuntu 「日本語」を選択
有効にするために「Restart」.
Ubuntu restart

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。


robocopy でエラー 50 (0x00000032)

次の様なコマンドでファイルをバックアップしていると,

robocopy "\\DevX\Public\Documents\Develop"  "\\AS5202T\Public\Document\Develop"  /e /xo /xf *.bak 
...
                           6    \\DevX\Public\Documents\Develop\VC_Test\T_mem\T_PhysF\
                           8    \\DevX\Public\Documents\Develop\VC_Test\T_STL\
2020/09/11 10:03:08 エラー 50 (0x00000032) コピー先ディレクトリにアクセスしています \\AS5202T\Public\Document\Develop\VC_Test\T_STL\
この要求はサポートされていません。
30 秒間待機しています... 再試行しています...

robocopy エラー 50 0x00000032
何かの拍子に開いたままの状態になってしまったみたいで ASUSTOR NAS で「切断」することで対応.
ADM 「システム情報」-「オンラインユーザー」-「切断」
* 使用しているユーザを切断しない様に注意.

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。


日本語名ファイルのアップロード

次の所から日本語名のファイルをアップロードはできていたが,コードでの対応はうまくできていなかった.
https://itl.mydns.jp/…/upload.htm
そのため,アップロード時に 7 ビットのファイル名に変換することで対応していた.
これらのコードを書いたのは 3 年位前なので,その当時はまだよくわかつていなかった.
https://mish.myds.me/wordpress/dev/2017/09/04/chttpfile-http-post/
またテクスチャファイル名などが日本語の場合はうまくいかないことも多かった.


最初,日本語名でそのままアップロードすると,いろいろ困った現象に…
PC から NAS 上のアップロード先のファイルが見えなくなってしまった.
一度スマートフォンの NAS 用のファイルマネージャから参照すると PC でも見えるようにはなった.
動作を見ると,サーバ側のコードは動作しているが,格納しているファイル名がうまく渡せていない.
ログなどを確認すると,デバッグ用 MBCS.exe でファイル名が「シフト JIS」のままになっていた.


送られるデータとしては次の所にあたる部分.
$_FILES[‘userfile’][‘name’]
これを UTF-8 にして渡す必要がある.
コードとしては次の所.

v_char	Make_send_data	(LPCTSTR upFile,LPCTSTR ___boundary)
{
	v_char	up_Data = v_c_Load(upFile) ;
	v_char	sndData ;
	{
		tstring	ct_boundary	=	___boundary ;
		tstring	file_img	=	::QuotM_Add(_T("file_img")) ;
		tstring	fileName	=	::QuotM_Add(::Path_GetName(upFile)) ;
		tstring	dataPre ;
		tstring	dataPst ;
		dataPre+=	CT_boundary__	+	ct_boundary	+			C_CRLF ;
		dataPre+=	CD_cd_f_d_n_	+	file_img	+	CD_cd__fn_	;
		dataPre+=				fileName	+			C_CRLF ;
		dataPre+=	CT_ct_a_o_s							C_CRLF ;
		dataPre+=									C_CRLF ;
		dataPst+=									C_CRLF ;
		dataPst+=	CT_boundary__	+	 ct_boundary	+	CT_boundary__	C_CRLF ;
	//	v_char	vc_pref = ::To_v_char(::To__string(dataPre.c_str())) ;
		v_char	vc_pref = ::To_v_char(::To_UTF8   (dataPre.c_str())) ;
		v_char	vc_post = ::To_v_char(::To__string(dataPst.c_str())) ;
		sndData.insert(sndData.end(),vc_pref.begin(),vc_pref.end()) ;
		sndData.insert(sndData.end(),up_Data.begin(),up_Data.end()) ;
		sndData.insert(sndData.end(),vc_post.begin(),vc_post.end()) ;
		}
	return	sndData ;
	}

To__string でそのまま char の配列としていたものを UTF-8 にしてから char の配列に.
UpFile.hxx アップロードするファイル名を UTF-8 に
UpFile.hxx
quotm.hxx


2020/09/08
今度はサーバ側のコード.
本当はクライアントの CInternetSession のコンストラクタで与える User Agent .
UTF-8 でセットすれば良いのはわかるが,引数が LPCTSTR なのでどうすれば良いかわからず.
そのためサーバ側のログを出力する部分でうまく機能しないことがある.
Synology NAS では,一部文字化けするが特に問題なさそう.
ASUSTOR NAS や QNAP NAS では,20200908.txt の読み込み時に止まっている様子.
次の様に //IGNORE を付加して変換.

iconv API は iconv_open(_T("UTF-8//IGNORE")) 
iconv -f CP932 -t UTF-8//IGNORE 20200908.txt >  20200908.uf8
uconv -f CP932 -t UTF-8 -i      20200908.txt -o 20200908.uf8
この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。



    top

    %d人のブロガーが「いいね」をつけました。