Iwao Dev

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

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

MFC

コンソール 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 人がこの 投稿 は役に立ったと言っています。

  にほんブログ村 IT技術ブログへ


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

次の所から日本語名のファイルをアップロードはできていたが,コードでの対応はうまくできていなかった.
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 人がこの 投稿 は役に立ったと言っています。

  にほんブログ村 IT技術ブログへ


CEdit に複数行の貼り付けで消える?

先日作成していたツールで,エディットボックスに複数行のデータを貼り付けるとうまく機能しない現象があった.
数行ならば OK だが,20 行位を超えると,一瞬表示されるが消えてしまう.
表示できる行数を超えていると貼り付けできないみたい.
Edit プロパティ 垂直スクロールバー 垂直オートスクロール
対応方法は「Edit プロパティ」の「垂直スクロールバー」か「垂直オートスクロール」にチェックを付ける.

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

  にほんブログ村 IT技術ブログへ


CHttpFile アップロードの https 対応

以前作成した MFC によるアップロード の https 対応.
前回コードを書いた頃は https の環境が用意できなかったのでそのままと(http に)なっていた.


次の関数を呼び出して接続しているが,それぞれ引数が異なるものが用意されている.
CInternetSession::GetHttpConnection
CHttpConnection::OpenRequest
それらの引数に dwFlags があり,INTERNET_FLAG_SECURE が指定できる.
最初,両方の呼び出しに指定してみたが,CInternetSession::GetHttpConnection は指定しなくても通った.

	CInternetSession session(userAgent.c_str()) ;
	CHttpConnection* pServer = NULL ;
	CHttpFile*       pFile = NULL ;
	{
	//	if (is_ssl) {
	//		pServer = session.GetHttpConnection(serverN.c_str(),INTERNET_FLAG_SECURE,nPort) ;
	//		}
	//	else {
			pServer = session.GetHttpConnection(serverN.c_str(),nPort) ;
	//		}
		if (pServer == NULL)		{	return	false ;		}
		}
	{
		if (is_ssl) {
			pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_POST,php,NULL,1,NULL,_T("HTTP/1.1"),INTERNET_FLAG_SECURE) ;
			}
		else {
			pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_POST,php) ;
			}
		if (pFile == NULL)		{	return	false ;		}
	//	...
		}

MFC を使用したアップロード  https post


参考にさせてもらったのは次の所.
How to send HTTPS request using WinInet?
WinInet(MFC)を使ったhttpとhttps(自己証明書)
WinInet (MFC) の SSL通信 で 開発中に自己署名証明書を利用する場合のコード

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

  にほんブログ村 IT技術ブログへ


std::fixed でアプリケーションエラー

先日やっていた計算式のコード.これをテストしていてエラーに.
エラーとなるコードの場所は数値を文字列に変換する所.
その部分だけを抜き出したコードは次の様なもの.

bool	test	(c_tstring& str_)
{
	tstring	str = str_ ;
	{
		TCHAR*	endPtr = 0 ;
		double	val = double(_tcstod(str.c_str(),&endPtr)) ;
							std::tout << std::fixed      << val << std::endl ;
	//	if (-1e50 < val && val < 1e50)	{	std::tout << std::fixed      << val << std::endl ;	}
	//	else				{	std::tout << std::scientific << val << std::endl ;	}
		}
	return	true ;
	}

1e300 などの値を std::fixed で表示すると,限られた環境でビルドした exe でエラーになる.
エラーが確認できたのは VC 6 で MFC を使用しないでビルドしたもの.
VC 6 でも DLL でリンクしている場合は,ランタイムの DLL のバージョンにより大丈夫.

Iwao@AS5202T:/volume1/home/Iwao/gcc_test/Test/mba_20/chk_big $ c++ chk_big.cpp  -Wall
Iwao@AS5202T:/volume1/home/Iwao/gcc_test/Test/mba_20/chk_big $ ./a.out
value ? =1e10
10000000000.000000
value ? =1e100
10000000000000000159028911097599180468360808563945281389781327557747838772170381060813469985856815104.000000
value ? =1e200
99999999999999996973312221251036165947450327545502362648241750950346848435554075534196338404706251868027512415973882408182135734368278484639385041047239877871023591066789981811181813306167128854888448.000000
value ? =1e300
1000000000000000052504760255204420248704468581108159154915854115511802457988908195786371375080447864043704443832883878176942523235360430575644792184786706982848387200926575803737830233794788090059368953234970799945081119038967640880074652742780142494579258788820056842838115669472196386865459400540160.000000
value ? =1e400
inf
value ? =1e307
9999999999999999860310597602564577717002641838126363875249660735883565852672743849064846414228960666786379280392654615393353172850252103336275952370615397010730691664689375178569039851073146339641623266071126720011020169553304018596457812688561947201171488461172921822139066929851282122002676667750021070848.000000
value ? =1e308
100000000000000001097906362944045541740492309677311846336810682903157585404911491537163328978494688899061249669721172515611590283743140088328307009198146046031271664502933027185697489699588559043338384466165001178426897626212945177628091195786707458122783970171784415105291802893207873272974885715430223118336.000000
value ? =1e309
inf
value ? =-1e100
-10000000000000000159028911097599180468360808563945281389781327557747838772170381060813469985856815104.000000
value ? =-1e307
-9999999999999999860310597602564577717002641838126363875249660735883565852672743849064846414228960666786379280392654615393353172850252103336275952370615397010730691664689375178569039851073146339641623266071126720011020169553304018596457812688561947201171488461172921822139066929851282122002676667750021070848.000000
value ? =-1e308
-100000000000000001097906362944045541740492309677311846336810682903157585404911491537163328978494688899061249669721172515611590283743140088328307009198146046031271664502933027185697489699588559043338384466165001178426897626212945177628091195786707458122783970171784415105291802893207873272974885715430223118336.000000
value ? =-1e309
-inf
value ? =1.e-100
0.000000
value ? =1.e-300
0.000000

ASUSTOR NAS で大きな数値の表示

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

  にほんブログ村 IT技術ブログへ


#pragma message (” ~ “) の利用

先日からやっているコードの解析部分を単体テスト用に分割していると,

--------------------構成: prs_frml - Win32 Debug--------------------
コンパイル中...
prs_frml.cpp
c:\program files\microsoft visual studio\vc98\mfc\include\afxv_w32.h(14) : fatal error C1189: #error :  WINDOWS.H already included.  MFC apps must not #include <windows.h>
cl.exe の実行エラー

prs_frml.exe - エラー 1、警告 0

「パッと見」でわかる時は良いが,今回はわかり難い.
そんな時に私が場所を限定していく手順.
次の様に影響していそうな所に #pragma message (” ~ “) を追加.

#pragma	 message ("pass 1")
#include "StrAryTo.hxx"
#pragma	 message ("pass 2")
#ifdef	 _MSC_VER
	 #ifdef	_AFXDLL
	 #else
		#ifndef	afxDump
		#define	afxDump	std::terr
		#endif
	 #endif
#endif
#pragma	 message ("pass 3")

エラーの場所を特定するために #pragma message を追加
今回は次の様になったので StrAyTo.hxx が原因とわかった.

pass 1
c:\program files\microsoft visual studio\vc98\mfc\include\afxv_w32.h(14) : fatal error C1189: #error :  WINDOWS.H already included.  MFC apps must not #include <windows.h>

StrAryTo.hxx は CStringArray と std::vector<tstring> を相互変換するコード.
インクルードから外すことで対応.


MFC を使用しているソースなどの対応方法は次の所.
https://mish.myds.me/wordpress/dev/2019/04/05/c1189-windows-h-already-included/

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

  にほんブログ村 IT技術ブログへ


C4244: ‘初期化中’: ‘INT_PTR’ から …

VC 2002 より前に作成した「ダイアログベース」のプロジェクトの場合 x64 対応に変更すると
XxxApp.cpp(73): warning C4244: ‘初期化中’: ‘INT_PTR’ から ‘int’ への変換です。データが失われる可能性があります。

生成されるスケルトンでは,アプリケーションクラスのダイアログの部分が次の様になっている.

	CFBXtoMDlg dlg;
	m_pMainWnd = &dlg;
	int nResponse = dlg.DoModal();
	if (nResponse == IDOK) 	{
	}
	else if (nResponse == IDCANCEL) {
	}

x86,x64 共に warning などを出なくするには,int となっている部分を INT_PTR に変更 する.

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

  にほんブログ村 IT技術ブログへ


「MFC を使用しない」のエラー

’91 年に C で作成して,’95 年頃に C++ で書き直したコード.
その頃は MFC なしでも動作するようにコードを書いていた.
が,’06 頃の UNICODE 化で MFC に依存するようになってしまっている.
VC6 「プロジェクトの設定」-「MFC を使用しない」
main 関数だけ用意して,対象の cpp をインクルードしてビルドすると,

--------------------構成: t_calc - Win32 Debug--------------------
コンパイル中...
t_calc.cpp
リンク中...
nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) はすでに libcpd.lib(delop.obj) で定義されています
nafxcwd.lib(thrdcore.obj) : error LNK2001: 外部シンボル "__endthreadex" は未解決です
nafxcwd.lib(thrdcore.obj) : error LNK2001: 外部シンボル "__beginthreadex" は未解決です
C:\Temp\Debug\Calc\t_calc\Debug.060/t_calc.exe : fatal error LNK1120: 外部参照 2 が未解決です。
link.exe の実行エラー

t_calc.exe - エラー 4、警告 0

どこかで Afx.h など MFC のコードをインクルードしてしまっている.
インクルードを順に辿るとすぐ見つかるが,どう修正するか悩むところ.
MFC を必要とする場合は今まで通りで,不要な場合は新しいコードに切り替えるか?

#ifdef	 _MFC_VER
#include <Afx.h>
#else
#include "_s_func.hxx"
#endif

ある程度必要なコードは特定できたがまだ書き直してないコードもありそう.


_MFC_VER で切り替えようと思ったが,コンソール AP ではうまく機能しない.
How to detect “Use MFC” in preprocessor
_MFC_VER は Afx.h の中で間接的(AfxVer_.h)に定義されている.
使えるのは _AFXDLL のみ?


次の様な感じ?

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

2020/02/14
ヘッダファイルで CString などを使用しているコードの部分は

#ifdef	 _MFC_VER
CString  ChangeString  (LPCTSTR str) ;
#endif
この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。

  にほんブログ村 IT技術ブログへ


VC 6 C2059 C2091 C2809 C2954

2001/11 作成のプロジェクトをビルドしたらよくわからないエラー.

--------------------構成: MsgStCon - Win32 Debug--------------------
コンパイル中...
MsgStCon.cpp
c:\program files\microsoft visual studio\vc98\include\memory(16) : error C2059: 構文エラー : 'string'
c:\program files\microsoft visual studio\vc98\include\memory(17) : error C2091: 関数は関数を返せません。
c:\program files\microsoft visual studio\vc98\include\memory(17) : error C2809: 'operator new' に仮引数リストがありません。
c:\program files\microsoft visual studio\vc98\include\memory(20) : error C2954: テンプレートの定義はネストできません。
cl.exe の実行エラー

MsgStCon.obj - エラー 4、警告 0

C2059 C2091 C2809 C2954


ソースの先頭付近に #include <memory> を追加.

#include	"StdAfx.h"
#include	"MsgStCon.h"

#include	<memory>	//	① OK
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#include	<memory>	//	② NG

//	...

②の位置では現象は変わらず.①の位置に追加する必要がある.

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

  にほんブログ村 IT技術ブログへ


CEdit で文字列の最後を表示させる

エディットボックスに文字列が入りきらない場合に,文字列の最後の方を表示させる方法
CEdit::SetSel length
例えば次のように UpdateData(FALSE) を呼び出すと CEdit::GetSel では開始位置と終了位置が 0 で戻される.

	m_OutFolder = Copy_ccc.GetTarget().c_str() ;
	UpdateData(FALSE) ;

CEdit::SetSel で文字列の長さを指定することにより最後の位置を選択してその部分が表示されるようにする.

	m_OutFolder = Copy_ccc.GetTarget().c_str() ;
	UpdateData(FALSE) ;
	int	start	= m_OutFolder.GetLength() ;
	int	end	= m_OutFolder.GetLength() ;
	m_CtrlOutFolder.SetSel(start,end) ;

2020/01/22 
選択文字列を常に強調表示するには,
「No Hide Selection」を Treu に

	int	start	= m_OutFolder.GetLength()-1 ;
	int	end	= m_OutFolder.GetLength()-0 ;

EN_NOHIDESEL を有効にする.
Edit Control  No Hide Selection

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

  にほんブログ村 IT技術ブログへ



    top

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