コンソール 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
2022/07/27
その後,Windows.h を使用するコードを書いていてのまとめ.
#include "i_def_aw.hxx" // #include <Windows.h>
Win32 API のみで書いていて,MFC を利用する可能性がある場合は,この様に置き換え可能と思われる.
そうでない場合は,それらを利用するソースの先頭で Afx.h または i_def_aw.hxx をインクルードすれば良い.
https://dev.mish.work/wordpress/?s=i_def_aw
2022/08/01
今回書いた FVersion.hxx の様に MFC を利用しないものは,Windows.h の方が良い.
MFC コードが混在する場合 は,i_def_aw.hxx の利用と _MFC_VER での振り分けが良さそう.
NAS VirtualBox に Win10 … 続き
今日 ASUSTOR NAS AS5202T の ADM を起動すると VirtualBox の更新版があった.
新しいものは 6.1.12.r01 .以前のものは 5.2.22 だったと思う.
以前 PC で作成した vdi を NAS にコピーして利用している環境 DevX .
5.2 の時よりも起動は安定したか?止まってしまうこともあり.
前回,インストールしようとしたが操作ができずそのままとなっていた.
VirtualBox の更新でどこかの設定が変更されたのかはわからないが,以前選択できなかった「リモートデスクトップ」の設定に入れるようになった.
Win10 PC の「リモートデスクトップ接続」で接続してインストール.
いつもの様に進めていくと「Microsoftアカウント」の入力に.
「代わりにドメインに参加する」を選択すると「ローカルアカウント」での入力ができた.
Joomla! の URL
Joomla! のページで,今まで URL に Joomla! が管理している ID が付加されていた.
特に困ってはなかったが,他の NAS に移行すると ID が変わってしまうみたいなので調べてみた.
検索してもなかなかいい情報がヒットしない.
それで見つけたのが次の所.
Joomlaの新しいSEF URL(パーマリンク)
「記事:オプション」の「ルーティング」の所を「モダン」を選択して「URLからIDを削除する」を「はい」に.
Joomla! は,インデックスされるまで 404 となってしまう.
そのため一部のページは次の様なファイルを置くことで対応.
https://mish.work/joomla/index.php/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/index.php/cpp/ref-vcredist-xxx-exe.html"> </head> <body > </body> </html>
TS-253D 再セットアップ – 5
外からアクセスすることはないが,念のため…
QTS に入るためのポートを変更.
Synology NAS では次の所に書かれている.
Synology NAS のセキュリティを強化する方法
QNAP NAS で書かれていた所.
ワンランク上のセキュリティ対策を施す「myQNAPcloud」
Linux Station のインストール.
続いて Ubuntu のインストール.
右の真ん中辺りの http://…/linux-station-vnc/ をクリックして起動できる.
そのままだと英語なので,日本語のインストール.
「Settings」-「Region & Language」-「Manage installed Languages」.
「Install / Remove Languages…」.
「Japanese」にチェックを付けて「Apply」.
どこかに設定があるのかもしれないが,インストールされた「日本語」を選べないので再ログイン.
有効にするために「Restart」.
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 秒間待機しています... 再試行しています...
何かの拍子に開いたままの状態になってしまったみたいで ASUSTOR NAS で「切断」することで対応.
* 使用しているユーザを切断しない様に注意.
日本語名ファイルのアップロード
次の所から日本語名のファイルをアップロードはできていたが,コードでの対応はうまくできていなかった.
https://itl.mish.work/…/upload.htm
そのため,アップロード時に 7 ビットのファイル名に変換することで対応していた.
これらのコードを書いたのは 3 年位前なので,その当時はまだよくわかっていなかった.
https://dev.mish.work/wordpress/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
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
FindExecutable と C2664
::FindExecutable の動作を確認しようと思い次の様なコードを書いた.
#include <clocale> #include <iostream> #include <Windows.h> #include "i_define.hxx" #include "tstring.hxx" tstring Get_doc_exe (LPCTSTR doc) { tstring exe_path ; exe_path.resize(MAX_PATH,0) ; ::FindExecutable(doc,NULL,&exe_path[0]) ; return exe_path.c_str() ; } int _tmain (int argc,TCHAR* argv[]) { _tsetlocale(LC_ALL,_T("")) ; { tstring buf ; buf.resize(1000) ; { while (std::terr << _T("file ? =") , std::tin.getline(&buf[0],buf.size())) { tstring str = buf.c_str() ; if (str == _T("q")) { break ; } else if (str == _T("Q")) { break ; } // str = ::QuotM_Del_All(str) ; if (str.empty()) { continue ; } // if (::File_IsNothing(str)) { continue ; } std::tout << ::Get_doc_exe(str.c_str()) << std::endl ; } } } return 0 ; }
MBCS でビルドすると問題ないが,UNICODE にすると,
--------------------構成: get_exe - Win32 Release-------------------- コンパイル中... get_exe.cpp C:\Documents and Settings\All Users\Documents\Develop\VC_Test\PC_doc\get_exe\get_exe.cpp(37) : error C2664: 'class std::basic_istream<unsigned short,struct std::char_traits<unsigned short> > &__thiscall std::basic_istream<unsigned short,struct std:: char_traits<unsigned short> >::getline(unsigned short *,int)' : 1 番目の引数を 'char *' から 'unsigned short *' に変換できません。 (新しい機能 ; ヘルプを参照) 指示された型は関連がありません; 変換には reinterpret_cast、 C スタイル キャストまたは関数スタイルのキャストが必要です。 C:\Documents and Settings\All Users\Documents\Develop\VC_Test\PC_doc\get_exe\get_exe.cpp(37) : fatal error C1903: 直前のエラーを修復できません; コンパイルを中止します。 cl.exe の実行エラー get_exe.exe - エラー 2、警告 0
C2664 については ここ .
Windows.h の include を i_define.hxx より後に.
::FindExecutable ではうまくない様な記述もあるが,今回の目的にはこれで良いかなと思う.
https://dobon.net/vb/dotnet/system/findassociatedexe.html
https://itl.mydns.jp/…/get_exe_2020_09.zip
更にちょっと面白い動作があったので…
#include "i_define.hxx" #include "tstring.hxx" #include <Windows.h> #include <clocale> #include <iostream> int _tmain (int argc,TCHAR* argv[]) { _tsetlocale(LC_ALL,_T("")) ; { tstring buf ; buf.resize(1000) ; { while (std::terr << _T("file ? =") , std::tin.getline(&buf[0],buf.size())) { tstring str = buf.c_str() ; if (str == _T("q")) { break ; } else if (str == _T("Q")) { break ; } if (str.empty()) { continue ; } ::ShellExecute(NULL,NULL,str.c_str(),NULL,NULL,SW_SHOWNORMAL) ; } } } return 0 ; }
関連付けされているドキュメントは,::ShellExecute で普通に開く.
そうでないドキュメントは,エクスプローラでクリックしたのと同じような動作.
NotePad や MSPaint などと入力すると,幾つかの exe は起動できる.
起動できないものもあり,その違いは不明.
https://itl.mydns.jp/…/se_doc_2020_09.zip
TS-253D 再セットアップ – 4
QTS で Virtualization Station をクリックすると,
「終了」を押してしばらくすると,
「VM の作成」.
予め iso は NAS にコピー済み.
「OK」を押すと,
ここは「キャンセル」.
「Win10x86」のアイコンを押すと,
「スタート」を押すと,Windows のセットアップが始まる.
後は Windows のいつものインストール動作.
「ローカルアカウント」でインストール.
「VM 情報」を選択して「ゲストツールCDを挿入する」.
ブラウザではあまり反応が良くない気がする.
PC などで操作する場合は VNC クライアント を使用した方が少しは快適.