NAS の隠しフォルダ
EZ Sync と Win11
ASUSTOR NAS の EZ Sync を使ってみようかと思い,セットアップ.
Win10 環境ではそれなりに動作することは確認.
Win11 環境で ASUSTOR EZ Sync をインストールすると,環境によるのかもしれないが幾つか問題が…
この仮想環境では,表示が乱れることがあり,設定などがうまく進められない.
ホストの Win11 環境では,ASUSTOR EZ Sync の起動もうまくできない.
デスクトップの再描画を繰り返して,ほとんど何も操作できなくなる.PC の再起動でやっと落ち着く.
また explorer.exe との相性が悪いみたいで,エクスプローラを開こうとするとすぐに閉じてしまう.
イベントビューアを見るとアプリケーションエラーになっている.
結局,この環境では ASUSTOR EZ Sync をアンインストールすることに.
Synology File Station
Synlogy NAS で Web サーバを公開している人は少ないのかもしれないが…
保有している多くの NAS で,ブラウザやスマートフォンなどからファイルを操作できる様になっている.
Synology NAS の場合は,File Station と DS file .
ほとんどの場合,PC から「エクスプローラ」で直接操作している.
たまに,スマートフォンの DS file で見る程度.
いろいろと操作していて,//192.168.x.xxx/(File Station のエイリアス)/ で開けてしまうことに気づいた.
以前は //192.168.x.xxx:5000/ の様な,DSM にログインする時と同じ方法だったと思う.
外からは操作することはないので,ファイアウォールなどで…と思うが,うまい設定がわからない.
error C2678: 二項演算子 ‘=’ :
ある処理を関数にしてコンパイルすると,
--------------------構成: VFDiv_1 - Win32 Debug--------------------
コンパイル中...
VFDiv_1V.cpp
c:\program files (x86)\microsoft visual studio\vc98\include\algorithm(232) : error C2678: 二項演算子 '=' : 型 'const struct Vector2<double>' の左オペランドを扱う演算子は定義されていません。(または変換できません)(新しい動作; ヘルプを参照)
c:\program files (x86)\microsoft visual studio\vc98\include\algorithm(228) : コンパイルされたクラスのテンプレートのインスタンス化 'void __cdecl std::_Iter_swap(const struct Vector2<double> *,const struct Vector2<double> *,struct Vector2<double> *)' の参照を確認してください
c:\program files (x86)\microsoft visual studio\vc98\include\algorithm(232) : error C2678: 二項演算子 '=' : 型 'const struct Vector2<double>' の左オペランドを扱う演算子は定義されていません。(または変換できません)(新しい動作; ヘルプを参照)
c:\program files (x86)\microsoft visual studio\vc98\include\algorithm(228) : コンパイルされたクラスのテンプレートのインスタンス化 'void __cdecl std::_Iter_swap(const struct Vector2<double> *,const struct Vector2<double> *,struct Vector2<double> *)' の参照を確認してください
cl.exe の実行エラー
VFDiv_1.exe - エラー 2、警告 0
対象が ‘const struct Vector2<double>’ となっているので,わかり辛かった.
次の関数の,’const Vd2A& v2a’ を std::reverse(v2a.begin(),v2a.end()) として使用しているのが原因.
PLF_face_l PLF_triangulation (const Vd2A& v2a)
{
// ...
std::reverse(v2a.begin(),v2a.end()) ;
// ...
}
HDL2-AAX8W 入手
以前から狙っていた HDL2-AAX8W を追加.
HDL2-AAX0/E に HDD を追加してと思っていたが,あまり変わらない価格帯でのものがあった.
最近は NAS キット ばかりだったが,用途が限定される NAS が欲しかった.
メインの用途はソースや PC データのバックアップ.
最初の設定 は HDL-AHW などと同様.
見た目は異なるが,ブラウザで IP を入力して設定画面に入って設定する.
内蔵されていた HDD は IronWolf だった.
DS220+ の IronWolf Pro 6TB は少し「カリカリ音」が気になるが,これは気にならない.
まだ LAN 環境が 1 Gbps なので,NAS の速度はこれで十分と思う.
Q’center Agent warning
先日から次の通知が届くようになった.
[Warning][Q’center Agent] Notification from your device: TS253D
NAS Name: TS253D
Severity: Warning
Date/Time: 2023/01/28 08:29:01
App Name: Q’center Agent
Category: Q’center Information
Message: [Q’center Agent] The connection between the NAS and Q’center is abnormal. NAS name: TS253D, Q’center server: 127.0.0.1.
©2023 QNAP Systems, Inc.
CPU の使用率が高くなっていたためと思われる.
CPU の負荷が高かったのは「Qsirch」のインデックス作成のため.
5 日程かかって終わった.
Mac からはいろいろとできそうだが,私の環境では,あまり期待した動作ではないか?
VS インストーラ 対象 OS
先日,.NET の ZipFile クラス を 使用した exe を作成した.
Win10 以降の環境では特に問題ないと思うが,テスト用に Win7 などでも同じ msi にしたかった.
「VS Installer target OS」で検索.
DOBON.NET 起動条件エディタの使い方
01264 : Windows Installer プロパティを使用した条件の設定
03192 : MSI で Windows 10 を判定する方法
Windows インストーラー
MDAC バージョンを確認する
調べるといろいろとできそうだが,今回は Win8 以前であれば iZIP.exe をインストールしない様に.
.NET Framework のバージョンおよび依存関係
exe のプロパティの「Condition」に「VersionNT>602」.
これで,Win7 には入らず,Win10 にはインストールされることを確認できた.
VirusTotal Phishing ?
2022/05 に mish.myds.me から ここ に移行した.
1ヶ月くらいで移行できたと思っていたが…
2022/10/20 頃からアクセス数が減ってきた.1 年前と比べると 1/3 程度に.
暫くわからなかったが,2022/12 に itl.mish.work にアクセスできない環境があった.
それで VirusTotal でチェックすると…
「Fortinet Phishing」などで検索して… やっと次の所にたどり着いた.
https://www.fortiguard.com/webfilter
2022/07/15 に「Phishing」になったのが原因?
https://www.virustotal.com/gui/domain/mish.work
Win7 Windows Update で 80072EFE
先日仮想マシンにセットアップした Win7 環境の Windows Update でエラー 80072EFE .
.NET Framework を使用しているものを実行すると,.NET … を要求され,そのセットアップに失敗してしまう.
「Win7 Windows Update 80072EFE」で検索すると…
Windows7 をインストール後、Windows Update が 80072EFE エラーでできない場合の対処方法
Windows Updateのエラー 8007000Eの対処はKB3138612で解決(Windows7)
2021年版:Windows 7 を久しぶりに更新する時の注意
KB3138612 を手動でインストールする必要があるみたい.
https://www.catalog.update.microsoft.com/Search.aspx?q=KB3138612
環境は x64 なので「Windows 7 for x64-Based Systems … (KB3138612)」をダウンロードしてインストール.
仮想マシンの再起動後 Windows Update に入ると,167 個の更新があった.
VirtualBox 7.0 に更新
Win10 と Win11 の ViurtalBox を 6.1.40 から 7.0.4 に更新した.
4K 環境になってから,いろいろと表示でうまくない部分があった.
Win10 環境は,Win11 の仮想マシンを除いては問題なさそう.
一度 Win11 仮想マシンを「除去」して,作成し直してみたが,うまく動作しない.
起動中の「お待ちください」の表示で止まってしまう.
仮想マシンの「設定」-「ディスプレイ」の「3Dアクセラレーションを有効化」にチェックして止まらなくなった.
どこかに設定があるものと思うが,OpenGL での表示がうまくされない.
Win11 環境は,LAN 関係のエラーでうまく起動しない.
6.1.40 に戻したがうまく起動しなくなってしまった.
「ネットワークアダプターを有効化」のチェックを外せば起動するが,これだとあまり使い物にならない.
ASUSTOR NAS でも同様のエラー になったことがあるので,設定ではないのか?
もう一度 7.0.4 にしてみたが,変わらず.
VM Name: Win10-VS6
Failed to open/create the internal network ‘HostInterfaceNetworking-VirtualBox Host-Only Ethernet Adapter’ (VERR_SUPDRV_COMPONENT_NOT_FOUND).
Failed to attach the network LUN (VERR_SUPDRV_COMPONENT_NOT_FOUND).
Result Code:
E_FAIL (0X80004005)
Component:
ConsoleWrap
Interface:
IConsole {6ac83d89-6ee7-4e33-8ae6-b257b2e81be8}
アンインストールやデバイスの削除を行って,再度インストールしたら少し動作する様になった.
デバイスマネージャーで VirtualBox Host-Only Ethernet Adapter がうまくなかったので,そこが原因だったか?
まだうまく動作しない仮想マシンもあるが,あとは個別の設定なので何とかなるかな?
2023/06/05
Win11 環境で 7.0.8 にあげて,LAN 関係で同じ様な現象.
PC を再起動して,うまく動作する様になった.
Synology Chat
Synology NAS にある Chat 機能をインストールした.
Chat Server をインストールすると,LAN 内の NAS ユーザであれば次の様な指定でアクセスできる.
//192.168.1.xxx/chat/
//192.168.1.xxx/chat/ の様にアクセスするために「ログインポータル」の設定が必要.
「コントロールパネル」-「ログインポータル」-「アプリケーション」で「Synology Chat」を選択して「編集」.
「エイリアス」の所で指定したものが //192.168.1.xxx/(エイリアス)/ として使用される.
ここでは https://chat.(example.com) などの様にアクセスする設定も可能.
私の NAS 環境では,自分以外は「テスト用」などしか登録していない.
そのため Chat のためにユーザを追加登録するのはちょっと目的が違う.
「Synology Chat ゲスト」で検索して「ゲスト機能」があることはわかっていたので,その設定.
「Chat Admin Console」の「設定」で「ゲストユーザーを許可」にチェック.
それで,その後の設定がなかなかわからなかった.
「チャンネルの作成」で「プライベート チャンネル」と「パブリック チャンネル」がある.
「ゲスト」ユーザは「プライベート チャンネル」の方で招待できる.
「プライベート チャンネル」を作成して,右上の「メンバー」アイコンをクリック.
すると「ゲスト」タブが表示される.
「ゲスト」タブを選択して「追加」すると「ゲスト電子メール」などを指定して招待メールを送信できる.
あとは,メールを受け取った側が自分でログイン情報を入力して,Synology Chat を利用できる様になる.
2023/01/03
ゲストユーザは,NAS 上の Homes の下に guest_(ユーザ名) で追加される.
2023/01/06
不要になったゲストユーザは「コントロールパネル」-「ユーザーとグループ」で削除できる.
2023/03/14
何故かわからないが,チャットのゲストで登録したアカウントでログインできない.
NAS の登録ユーザであれば //(NAS)/chat/ から入ってログインできる.
スマートフォンの「Chat」からも問題ないが,ブラウザの時にうまくない様子.
どうも,招待メールにあるアドレスから入る必要があるみたい.
https://(NAS)/chat/guest/index.html#eyJ0eXAiOiJ…
更に試すと,次の様に # 以降はなくても大丈夫.
https://(NAS)/chat/guest/index.html
PPAP の代わりとしても使えると思う.
2024/12/19
2 年位使用している.メールなどと使い分けることでうまく使えている.
VirusTotal Cylance Unsafe
1 年位前から,exe をビルドしてデバッグが終わると VirusTotal でチェックしている.
それで,誤検知されやすいと思われる VC のバージョンなどのメモ.
VC6.exe では,ほとんどが何らかのものに引っ掛かってしまう.
SecureAge Malicious
VC8.exe や VC9.exe も何かに引っ掛かってしまうことが多い.
VC 10 ~ VC 12 では,あまり規則性はわからない.コードによる?
VC 14 以降は,普通の MFC のコードであればほぼ問題なさそう.
但し最初のうちは,ほとんど Cylance Unsafe となってしまう.
が,数日経過すると警告は消えることが多い.
error C2668: ‘abs’
1>------ ビルド開始: プロジェクト: ClCpy, 構成: Debug Win32 ------
1>コンパイルしています...
1>ClCpyDlg.cpp
1>l:\document\develop\tools\_free\tiny\clcpy\clcpydlg.cpp(396) : error C2668: 'abs' : オーバーロード関数の呼び出しを解決することができません。(新機能 ; ヘルプを参照)
1> c:\program files (x86)\microsoft visual studio 8\vc\include\math.h(539): 'long double abs(long double)' の可能性があります。
1> c:\program files (x86)\microsoft visual studio 8\vc\include\math.h(491): または 'float abs(float)'
1> c:\program files (x86)\microsoft visual studio 8\vc\include\math.h(487): または 'double abs(double)'
1> c:\program files (x86)\microsoft visual studio 8\vc\include\math.h(485): または 'long abs(long)'
1> c:\program files (x86)\microsoft visual studio 8\vc\include\stdlib.h(415): または 'int abs(int)'
1> 引数リスト '(size_t)' を一致させようとしているとき
1>ビルド時間 0:07
1>ClCpy - エラー 1、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ==========
次の様に long にキャストすることで対応.
size_t len_ = ::abs(long(lenS-lenD)) ;
Win11 MFC80u.dll などの場所
VC 2005 で作成した exe がうまく起動しないと連絡が入った.
すぐに dll などがないためとわかり,VC 2005 SP1 vcredist_x86.exe を入れて対応してもらった.
https://jml.mish.work/index.php/cpp/ref-vcredist-xxx-exe.html
それで,Win11 環境の c:\Windows\WinSxS\ の MFC80*.dll を見ると,それらしいものが見当たらない.
Win10 では …\WinSxS\ に存在する.
explorer で検索すると Win11 では ..\WinSxS\Fusion\ 以下になっている.
.NET ZipFile C++/CLI
ZipFile クラスのサンプル を VC 2012 C++/CLI で.
Win32 コンソール AP としてプロジェクトを作成.
CPP を次の様に変更.
#include <stdio.h>
#include <tchar.h>
// using System;
// using System.IO.Compression;
#using <System.dll>
#using <System.IO.Compression.FileSystem.dll>
// class Program
// {
// static void Main(string[] args)
// {
int _tmain(int argc, _TCHAR* argv[])
{
// string startPath = @"./start";
// string zipPath = @"./result.zip";
// string extractPath = @"./extract";
System::String^ startPath = _T("./start") ;
System::String^ zipPath = _T("./result.zip") ;
System::String^ extractPath = _T("./extract") ;
// ZipFile. CreateFromDirectory(startPath, zipPath);
System::IO::Compression::ZipFile::CreateFromDirectory(startPath, zipPath);
// ZipFile. ExtractToDirectory(zipPath, extractPath);
System::IO::Compression::ZipFile::ExtractToDirectory(zipPath, extractPath);
return 0;
}
// }
// }
そのままビルドすると…
1>------ ビルド開始: プロジェクト: T_ZIP_C, 構成: Debug Win32 ------
1> T_ZIP_C.cpp
1>d:\document\vs\vs\2012\t_clr\t_zip_c\t_zip_c.cpp(6): fatal error C1190: マネージ ターゲット コードには '/clr' が必要です。
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
1>------ ビルド開始: プロジェクト: T_ZIP_C, 構成: Debug Win32 ------
1> T_ZIP_C.cpp
1>T_ZIP_C.cpp(7): fatal error C1107: アセンブリ 'System.IO.Compression.FileSystem.dll' がみつかりませんでした: /AI または LIBPATH 環境変数を使用してアセンブリ検索パスを指定してください。
========== ビルド: 0 正常終了、1 失敗、3 更新不要、0 スキップ ==========
「追加の #using ディレクトリ」に dll の場所を指定して通る様にはなったが,これで良いかがわからない.
ほとんど何も入っていない環境で実行すると,
---------------------------
T_ZIP_C.exe - システム エラー
---------------------------
MSVCR110.dll が見つからないため、コードの実行を続行できません。プログラムを再インストールすると、この問題が解決する可能性があります。
---------------------------
OK
---------------------------
VC 2013 や 2015 でビルドしたものも試してみたが,この環境では実行できなかった.
対応するものを入れる必要があるのか?
https://jml.mish.work/index.php/cpp/ref-vcredist-xxx-exe.html
2024/07/05
VC のバージョン(実際は .NET のバージョン?)により,微妙に zip の内容が異なるみたい.
3MF データが開けない?
.NET ZipFile C#
今まで Windows で zip を扱う部分で Shell を利用 してきた.
その時,存在は知っていたが,手を付けてなかった .NET を利用したものを調べることに…
サンプルは次の所にある.
ZipFile クラス
.NET Framework 4.5 以降なので VS 2012 で C# のプロジェクトを作成.
Program.cs をサンプルの様に変更してビルドすると…
1>------ ビルド開始: プロジェクト: T_ZIP, 構成: Debug Any CPU ------
1>D:\Document\VS\VS\2012\T_CLR\T_ZIP\Program.cs(12,9,12,16): error CS0103: 名前 'ZipFile' は現在のコンテキスト内に存在しません。
1>D:\Document\VS\VS\2012\T_CLR\T_ZIP\Program.cs(14,9,14,16): error CS0103: 名前 'ZipFile' は現在のコンテキスト内に存在しません。
========== ビルド: 0 正常終了、1 失敗、1 更新不要、0 スキップ ==========
そこにも書かれているが System.IO.Compression.FileSystem を追加する必要がある.
…\bin\…\start\ に,幾つかのファイルをコビー.
exe を実行すると,result.zip と …\extract\ 以下にファイルが解凍される.
再度実行する場合は result.zip と extract\ を削除する必要がある.
簡易 Web サーバ C++/CLI
先日の C# のコードから C++/CLI に書き直したものの 更新版 .
index.html の作成と,ContentType の設定,日本語ファイル名への対応など.
#ifdef __cplusplus_cli
#using <System.dll>
#using <System.Web.dll>
#include <vcclr.h>
#endif
///////////////////////////////////////////////////////////////////////////
#include "S_Exec.hxx"
#include "str_CLI.hxx"
#include "filestat.hxx"
#include "filepath.hxx"
#include "ask_path.hxx"
#include "itls_tmp.hxx"
#include "textfile.hxx"
#include "htmout.hxx"
#include "stringfn.hxx"
///////////////////////////////////////////////////////////////////////////
struct MIME_type {
LPCTSTR FExt ;
LPCTSTR Type ;
} ;
// https://developer.mozilla.org/ja/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types
const MIME_type MIME_type_tbl[] =
{
_T("htm" ) , _T("text/html") ,
_T("html") , _T("text/html") ,
_T("txt" ) , _T("text/plain") ,
_T("bmp" ) , _T("image/bmp") ,
_T("jpeg") , _T("image/jpeg") ,
_T("jpg" ) , _T("image/jpeg") ,
_T("png" ) , _T("image/png") ,
_T("svg" ) , _T("image/svg+xml") ,
_T("bin" ) , _T("application/octet-stream") ,
_T("pdf" ) , _T("application/pdf") ,
_T("zip" ) , _T("application/zip") ,
_T(" " ) , _T("") ,
_T("\0" ) , _T("") ,
_T("" ) , _T("") ,
} ;
inline tstring get_MIME_type (LPCTSTR ext_)
{
tstring type = _T("application/octet-stream") ;
tstring ext = ::String_ToLower(ext_) ;
if (ext.empty()) {
return type ;
}
const MIME_type* mm_ty = MIME_type_tbl ;
{
for (size_t index=0 ; index<countof(MIME_type_tbl) ; index++)
{
tstring fext = mm_ty[index].FExt ;
tstring ftyp = mm_ty[index].Type ;
if (fext.length() == 0) { continue ; }
if (fext.length() != ext.length()) { continue ; }
if (ext == fext) {
return mm_ty[index].Type ;
}
}
}
return type ;
}
///////////////////////////////////////////////////////////////////////////
inline tstring HT_Make_index_content (c_tstring& fold)
{
v_tstring sub_folds = ::EnumFolders(fold.c_str()) ;
v_tstring htm_files = ::EnumFiles (fold.c_str(),_T("*.htm*")) ;
tstring foldName = ::Path_GetTitle(fold) ;
tstring htm_str ;
{
Xml_E htm = HtmOut::html() ;
{
Xml_E head(HTM_head) ;
{
head.AddChild(HtmOut::charset_UTF_8()) ;
head.AddChild(HtmOut::meta_viewport()) ;
head.AddChild(HtmOut::title(foldName)) ;
}
{
head.AddChild(HtmOut::comment()) ;
}
htm.AddChild(head) ;
}
{
Xml_E body(HTM_body) ;
{
{
body.AddChild(HtmOut::a_parent()) ;
body.AddChild(HtmOut::hr()) ;
}
{
for (size_t index=0 ; index<sub_folds.size() ; index++) {
tstring fold = sub_folds[index] ;
fold = ::Path_DelLastSP(fold) ;
Xml_E a_fold = HtmOut::a(::Path_GetName(fold)+_T("/")) ;
body.AddChild(a_fold) ;
body.AddChild(HtmOut::br()) ;
}
body.AddChild(HtmOut::hr()) ;
}
{
for (size_t index=0 ; index<htm_files.size() ; index++) {
tstring html = htm_files[index] ;
Xml_E a_html = HtmOut::a(::Path_GetName(html)) ;
body.AddChild(a_html) ;
body.AddChild(HtmOut::br()) ;
}
}
}
htm.AddChild(body) ;
}
htm_str = htm.ToText() ;
}
return htm_str ;
}
tstring Make_index (c_tstring& fold)
{
tstring result = ::HT_Make_index_content(fold) ;
return result ;
}
///////////////////////////////////////////////////////////////////////////
bool web_server (c_tstring& fold,const u_16 port)
{
tstring root_ = fold ;
tstring port_ = ::To_tstring(port) ;
tstring pref_ = _T("http://127.0.0.1:")+port_+_T("/") ;
System::String^ root = ::to_gcString(root_) ;
System::String^ prefix = ::to_gcString(pref_) ;
System::Console::WriteLine(prefix) ;
System::Net::HttpListener^ listener = gcnew System::Net::HttpListener();
listener->Prefixes->Add(prefix);
listener->Start();
while (true) {
System::Net::HttpListenerContext^ context = listener->GetContext();
System::Net::HttpListenerRequest^ req = context->Request;
System::Net::HttpListenerResponse^ res = context->Response;
System::String^ path = root + req->RawUrl->Replace("/", "\\");
path = System::Web::HttpUtility::UrlDecode(path) ;
{
System::Console::WriteLine(req->RawUrl);
System::Console::WriteLine(path) ;
}
if (System::IO::File::Exists(path)) {
}
if (System::IO::File::Exists(path)) {
tstring ext = ::Path_GetExtLow(::to_tstring(path)) ;
array<System::Byte>^ content = System::IO::File::ReadAllBytes(path);
res->ContentType = ::to_gcString(::get_MIME_type(ext.c_str())) ;
res->OutputStream->Write(content, 0, content->Length);
}
else {
tstring cnt_index = ::Make_index (::to_tstring(path)) ;
array<System::Byte>^ content ;
{
static long i_count = 0 ;
i_count++ ;
tstring tmp_path = ::Get_i_Tools_tmp_date() ;
tstring htm_name = ::To_tstring(port) + _T("_") + ::u32to0t(i_count,10,4) + _T(".htm") ;
tstring out_path = ::Path_AddLastSP(tmp_path) + htm_name ;
::SaveUTF8(out_path.c_str(),cnt_index) ;
content = System::IO::File::ReadAllBytes(::to_gcString(out_path.c_str())) ;
}
res->ContentType = ::to_gcString(::get_MIME_type(_T("htm"))) ;
res->OutputStream->Write(content, 0, content->Length);
}
res->Close();
}
return true ;
}
///////////////////////////////////////////////////////////////////////////
bool test (c_tstring& str)
{
tstring fold = str ;
{
if (::File_IsDirectory(fold)) { ; }
else { fold = ::Path_GetDir(fold) ; }
}
std::terr << fold << std::endl ;
{
u_16 tick = u_16(::GetTickCount()) ;
u_16 port = u_16(50000 + (tick&0x1fff)) ;
{
tstring port_ = ::To_tstring(port) ;
tstring pref_ = _T("http://127.0.0.1:")+port_+_T("/") ;
S_Exec se ;
se.SetFile(pref_.c_str()) ;
se.Execute() ;
}
::web_server(fold,port) ;
}
return true ;
}
///////////////////////////////////////////////////////////////////////////
int _tmain (int argc,_TCHAR* argv[])
{
tstring path ;
{
#ifdef OFN_filter_All
path = ::ask_path(false) ;
// path = ::ask_path(true) ;
#else
path = ::ask_cli(_T("folder ... ? =")) ;
#endif
}
if (!path.empty()) {
::test(path) ;
}
return 0;
}
///////////////////////////////////////////////////////////////////////////
#include "messbar.cxx"
* 幾つかのコードが揃っていないため,そのままではビルドできません.
https://jml.mish.work/index.php/i-tools/web-svr.html
2024/11/02
VC 2005 でビルド可能な一式を用意しました.
https://itl.mish.work/i_Tools/Doc/blog/vc/T_h_lstn.zip
パッケージが最新版ではありません
C# のコードを C++/CLI に
先日の「簡易 Web サーバ C#」のコードを C++ で.
///////////////////////////////////////////////////////////////////////////////////
// C# -> C++/CLI
///////////////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <tchar.h>
//using System;
//using System.IO;
//using System.Net;
#using <System.dll>
bool test (void)
{
//
// class SimpleWebServer
// {
// static void Main()
// {
// string root = @"c:\wwwroot\"; // ドキュメント・ルート
// root = @".\";
System::String^ root = "./" ;
// string prefix = "http://*/"; // 受け付けるURL
// prefix = "http://127.0.0.1:65432/" ;
System::String^ prefix = "http://127.0.0.1:55555/" ;
//
// HttpListener listener = new HttpListener();
System::Net::HttpListener^ listener = gcnew System::Net::HttpListener();
// listener. Prefixes. Add(prefix); // プレフィックスの登録
listener->Prefixes->Add(prefix);
// listener. Start();
listener->Start();
//
// while (true) {
while (true) {
// HttpListenerContext context = listener. GetContext();
System::Net::HttpListenerContext^ context = listener->GetContext();
// HttpListenerRequest req = context. Request;
System::Net::HttpListenerRequest^ req = context->Request;
// HttpListenerResponse res = context. Response;
System::Net::HttpListenerResponse^ res = context->Response;
//
// Console. WriteLine(req. RawUrl);
System::Console::WriteLine(req->RawUrl);
//
// // リクエストされたURLからファイルのパスを求める
// string path = root + req. RawUrl. Replace("/", "\\");
System::String^ path = root + req->RawUrl->Replace("/", "\\");
//
// // ファイルが存在すればレスポンス・ストリームに書き出す
// if ( File. Exists(path)) {
if (System::IO::File::Exists(path)) {
// byte[] content = File. ReadAllBytes(path);
array<System::Byte>^ content = System::IO::File::ReadAllBytes(path);
// res. OutputStream. Write(content, 0, content. Length);
res->OutputStream->Write(content, 0, content->Length);
// }
}
// res. Close();
res->Close();
// }
}
// }
// }
//
return true ;
}
int _tmain(int argc, _TCHAR* argv[])
{
::test() ;
return 0;
}
VC 8 で C++/CLI
VC 10 ではある程度確認が取れたので,今度は VC 8 で.
先ず,コンソール AP .ビルドすると,
1>------ ビルド開始: プロジェクト: T_Con_1, 構成: Debug Win32 ------
1>コンパイルしています...
1>T_Con_1.cpp
1>EnumFile.hxx MessageBar No Support
1>C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\vcclr.h(43) : error C2446: '!=' : 'int' 型から 'cli::interior_ptr<Type>' 型への変換ができません。
1> with
1> [
1> Type=unsigned char
1> ]
1>T:\Develop\_.SRC\_CLI\str_CLI.hxx(41) : error C2446: '==' : 'int' 型から 'System::String ^' 型への変換ができません。
1> 使用可能なユーザー定義された変換演算子がない、または
1> 演算型のボックス化された形式からターゲット型への標準変換は存在しません
1>T:\Develop\_.SRC\_CLI\str_CLI.hxx(61) : warning C4267: '初期化中' : 'size_t' から 'int' に変換しました。データが失われているかもしれません。
1>T:\Develop\_.SRC\_CLI\str_CLI.hxx(64) : warning C4267: '初期化中' : 'size_t' から 'int' に変換しました。データが失われているかもしれません。
1>T_Con_1 - エラー 2、警告 2
========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ==========
vcclr.h 内のエラーは,次の様に cpp の最初で vcclr.h を読み込むことで回避できる.
#ifdef __cplusplus_cli
#include <vcclr.h>
#endif
もう一つのエラーは次の所で,str が nullptr でないかを比較している所.
tstring to_tstring (System::String^ str)
{
if (str == nullptr) { return _T("") ; }
pin_ptr <const wchar_t> pStr = PtrToStringChars(str) ;
tstring tstr = pStr ;
return tstr ;
}