NAS の証明書の更新
先日 Synology NAS の証明書の期限が切れてしまった.
DSM に入って「コントロールパネル」-「セキュリティ」-「証明書」タブ.
対象のものを「選択」して「右クリック」-「証明書を更新」で更新できる.
以前は「自動更新」できていたが,mish.work を取っていろいろ設定したらうまく更新できなくなったみたい.
mish.work を取ってからは,それぞれの NAS で証明書を取る様に設定した.
今までのものは Synology NAS ,mish.work は QNAP NAS ,as.mish.work は ASUSTOR NAS .
今日 QNAP NAS を見ると自動で更新できたみたい.
これらをもう少しうまくできないものかと…
mish.work の関係を Synology NAS で取得しようとするがうまくいかない.
QNAP NAS ではうまくいっているみたいなので,ds. と as. のみにしてみたが変わらず.
IPv6 が反映されていない関係か?
2021/07/13
うまく取得できないのでしばらく様子見.
::GetDiskFreeSpaceEx , ::statvfs
Win9x が多く存在していた頃のコードの MFC を使用しない方法での書き直し.
前のものは次の様になっている.
// J048221 SDK32:GetDiskFreeSpace と GetDiskFreeSpaceEx について
typedef BOOL (WINAPI *P_GDFSE)(LPCTSTR, PULARGE_INTEGER,PULARGE_INTEGER, PULARGE_INTEGER);
// ..
fResult = ::GetDiskFreeSpace(pszDrive,&SectorsPerCluster,&BytesPerSector,&FreeClusters,&TotalClusters) ;
if (fResult) {
TotalBytes = (__int64)TotalClusters * SectorsPerCluster * BytesPerSector ;
TotalFreeBytes = (__int64)FreeClusters * SectorsPerCluster * BytesPerSector ;
FreeBytesAvailable = TotalFreeBytes ;
}
// ..
{
P_GDFSE pGetDiskFreeSpaceEx = NULL;
#ifdef UNICODE
pGetDiskFreeSpaceEx = (P_GDFSE)GetProcAddress(GetModuleHandle(_T("kernel32.dll")),"GetDiskFreeSpaceExW") ;
#else
pGetDiskFreeSpaceEx = (P_GDFSE)GetProcAddress(GetModuleHandle(_T("kernel32.dll")),"GetDiskFreeSpaceExA") ;
#endif
if (pGetDiskFreeSpaceEx) {
fResult = pGetDiskFreeSpaceEx (pszDrive,
(PULARGE_INTEGER)&FreeBytesAvailable,
(PULARGE_INTEGER)&TotalBytes,
(PULARGE_INTEGER)&TotalFreeBytes);
}
}
https://www.betaarchive.com/wiki/index.php?title=Microsoft_KB_Archive/231497
Windows 環境では次の様な感じ?
class DiskFree {
public:
DiskFree () { Free = Total = 0 ; }
public:
u_64 Free ;
u_64 Total ;
} ;
DiskFree GetDiskFree (LPCTSTR path)
{
DiskFree df ;
u_64 freeC = 0 ;
u_64 free = 0 ;
u_64 total = 0 ;
if (::GetDiskFreeSpaceEx(path,(PULARGE_INTEGER)&freeC,(PULARGE_INTEGER)&total,(PULARGE_INTEGER)&free)) {
df.Free = free ;
df.Total= total;
}
return df ;
}
Linux 環境では ::statvfs が使えるみたいで,次の様なコードで取得してデバッガで確認.
#include <iostream>
#include <sys/statvfs.h>
int main()
{
struct statvfs vfs = { 0 } ;
::statvfs(".", &vfs) ;
return 0 ;
}
vfs {...} statvfs
f_bsize 4096 unsigned long
f_frsize 4096 unsigned long
f_blocks 1452408524 __fsblkcnt_t
f_bfree 200259802 __fsblkcnt_t
f_bavail 199469255 __fsblkcnt_t
f_files 183001088 __fsfilcnt_t
f_ffree 181248356 __fsfilcnt_t
f_favail 181248356 __fsfilcnt_t
f_fsid 3941329918106335254 unsigned long
f_flag 4096 unsigned long
f_namemax 255 unsigned long
__f_spare int [6]
[0] 0 int
[1] 0 int
[2] 0 int
[3] 0 int
[4] 0 int
[5] 0 int
Iwao@AS5202T:/volume1/home/Iwao $ cd gcc_test/Test/t_linux/T_vfs/T_s_vfs/
Iwao@AS5202T:/volume1/home/Iwao/gcc_test/Test/t_linux/T_vfs/T_s_vfs $ ll
total 12
drwxrwxrwx 2 Iwao users 4.0K Jul 1 22:01 ./
drwxrwxrwx 4 Iwao users 4.0K Jul 1 22:00 ../
-rwxrwxrwx 1 Iwao users 581 Jul 1 21:55 T_s_vfs.cpp*
Iwao@AS5202T:/volume1/home/Iwao/gcc_test/Test/t_linux/T_vfs/T_s_vfs $ cat T_s_vfs.cpp
#include <iostream>
#include <clocale>
#include <sys/statvfs.h>
#include "_tdefine.hxx"
#include "t_tstrng.hxx"
int _tmain (int argc,TCHAR* argv[])
{
_tsetlocale(LC_ALL,_T("")) ;
{
struct statvfs vfs = { 0 } ;
if (::statvfs(".", &vfs) == 0) {
u_64 free = vfs.f_bavail * vfs.f_frsize ;
u_64 total= vfs.f_blocks * vfs.f_frsize ;
std::tout << ::To_tstring_Ki(free) << _T(" / ") << ::To_tstring_Ki(total) << std::endl ;
std::tout << ::To_tstring_cs(free) << _T(" / ") << ::To_tstring_cs(total) << std::endl ;
}
}
return 0 ;
}
Iwao@AS5202T:/volume1/home/Iwao/gcc_test/Test/t_linux/T_vfs/T_s_vfs $ g++ T_s_vfs.cpp -Wall
Iwao@AS5202T:/volume1/home/Iwao/gcc_test/Test/t_linux/T_vfs/T_s_vfs $ ./a.out
760.90 G / 5.41 T
817,005,420,544 / 5,949,065,314,304
Iwao@AS5202T:/volume1/home/Iwao/gcc_test/Test/t_linux/T_vfs/T_s_vfs $
NAS lxcdebian10 と VC 2019
ASUSTOR NAS 上の Debian と VC 2019 を使用してのビルドとデバッグ.
VC で次の様なエラーになっている.
lxcdebian10 にツールがありません: gdb rsync zip
次の所にある様に必要なものをインストール.
Linux development with C++ in Visual Studio
丁度 1 年前にやっていた みたいで,その時より 安定したか?
C2535 , C2382
今まで特に問題なくビルドできていたプロジェクト.今月に入ってからは VC 2015 まででビルドしていた.
VC 2017 ------ ビルド開始: プロジェクト: i3DV, 構成: Debug Win32 ------ C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\VCTargets\Platforms\Win32\PlatformToolsets\v141_xp\Toolset.targets(39,5): warning MSB8051: Windows XP をターゲットとするサポートは非推奨であり、Visual Studio の将来のリリースで提供されなくなります。詳細については、https://go.microsoft.com/fwlink/?linkid=2023588 をご覧ください。 ComGui03.cpp OpGL.hxx Support Dbg.hxx Auto server No Support c:\program files (x86)\microsoft visual studio\2017\professional\vc\tools\msvc\14.16.27023\include\comip.h(152): error C2535: '_com_ptr_t<_IIID>::_com_ptr_t(int)': メンバー関数は、既に定義または宣言されています。 c:\program files (x86)\microsoft visual studio\2017\professional\vc\tools\msvc\14.16.27023\include\comip.h(141): note: '_com_ptr_t<_IIID>::_com_ptr_t' の宣言を確認してください c:\program files (x86)\microsoft visual studio\2017\professional\vc\tools\msvc\14.16.27023\include\comip.h(938): note: コンパイル対象の クラス テンプレート インスタンス化 '_com_ptr_t<_IIID>' のリファレンスを確認してください プロジェクト "i3DV141.vcxproj" のビルドが終了しました -- 失敗。 ========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
VC 2019 ビルドを開始しました... ------ ビルド開始: プロジェクト: i3DV, 構成: Debug Win32 ------ ComGui03.cpp OpGL.hxx Support Dbg.hxx Auto server No Support C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30037\include\comip.h(115,5): error C2382: '_com_ptr_t<_IIID>::_com_ptr_t': 再定義 ; 異なる例外指定です。 C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30037\include\comip.h(113): message : '_com_ptr_t<_IIID>::_com_ptr_t' の宣言を確認してください C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30037\include\comip.h(1096): message : コンパイル対象の クラス テンプレート インスタンス化 '_com_ptr_t<_IIID>' のリファレンスを確認してください C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30037\include\comip.h(381,10): error C2382: '_com_ptr_t<_IIID>::operator ==': 再定義 ; 異なる例外指定です。 C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30037\include\comip.h(371): message : '_com_ptr_t<_IIID>::operator ==' の宣言を確認してください C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30037\include\comip.h(446,10): error C2382: '_com_ptr_t<_IIID>::operator !=': 再定義 ; 異なる例外指定です。 C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30037\include\comip.h(436): message : '_com_ptr_t<_IIID>::operator !=' の宣言を確認してください C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30037\include\comip.h(511,10): error C2382: '_com_ptr_t<_IIID>::operator <': 再定義 ; 異なる例外指定です。 C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30037\include\comip.h(501): message : '_com_ptr_t<_IIID>::operator <' の宣言を確認してください C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30037\include\comip.h(577,10): error C2382: '_com_ptr_t<_IIID>::operator >': 再定義 ; 異なる例外指定です。 C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30037\include\comip.h(566): message : '_com_ptr_t<_IIID>::operator >' の宣言を確認してください C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30037\include\comip.h(643,10): error C2382: '_com_ptr_t<_IIID>::operator <=': 再定義 ; 異なる例外指定です。 C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30037\include\comip.h(633): message : '_com_ptr_t<_IIID>::operator <=' の宣言を確認してください C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30037\include\comip.h(709,10): error C2382: '_com_ptr_t<_IIID>::operator >=': 再定義 ; 異なる例外指定です。 C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30037\include\comip.h(699): message : '_com_ptr_t<_IIID>::operator >=' の宣言を確認してください プロジェクト "i3DV142.vcxproj" のビルドが終了しました -- 失敗。 ========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
Win10 を 1909 から 20H2 に上げたのと,VS 2019 のアップデートがあった.
検索 をかけても,これといった情報には引っかからない.
となると,最近変更したコード?
nullptr を定義したことを思い出した.
VC 2015 以降では定義されない様に変更.
うまくいった.
nullptr は VC10 以降で使えるみたいで _MSC_VER < 1600 に変更.
https://ja.wikipedia.org/wiki/Microsoft_Visual_C++
C2664
スタックを使用した次の様なコード.
stack_s so ;
エラー情報を指定する様に変更してビルド.
i_error ie ; stack_s so(&ie) ;
--------------------Configuration: t_stack - Win32 Debug-------------------- Compiling... t_stack.cpp d:\document\vs\vs\1998\t_stack\t_stack\t_stack.cpp(14) : error C2664: '__thiscall stack_s::stack_s(const class stack_s &)' : cannot convert parameter 1 from 'class i_error *' to 'const class stack_s &' Reason: cannot convert from 'class i_error *' to 'const class stack_s' No constructor could take the source type, or constructor overload resolution was ambiguous Error executing cl.exe. T_stack.exe - 1 error(s), 0 warning(s)
C2664 になってしまう.
class stack_b { public: stack_b (i_error* i_err=NULL) { ie = &tmp_ie ; if(i_err != NULL) { ie = i_err ; } } protected: i_error tmp_ie ; i_error* ie ; } ; class stack_s : public stack_b { public: // stack_s (i_error* i_err=NULL) : stack_b (i_err) { ; } public: virtual bool push (c_tstring& s) ; virtual tstring pop (void) ; virtual tstring last (void) ; protected: s_tstring stck_s ; } ;
SHBrowseForFolder
今度はフォルダの参照.
ダイアログを表示するだけの最低限のコード.
#include <ShlObj.h>
bool Test (void)
{
BROWSEINFO bi = { 0 } ;
LPITEMIDLIST pidl = ::SHBrowseForFolder(&bi) ;
if (pidl == NULL) { return false ; }
::CoTaskMemFree(pidl) ;
return true ;
}
int main (void)
{
while (true) {
if (!Test()) {
break ;
}
}
return 0 ;
}
BROWSEINFO の hwndOwner も指定していないので動作がモードレスになってしまう.
SHBrowseForFolder のドキュメントを見ると IFileDialog FOS_PICKFOLDERS とある.
選択したフォルダ名を戻すように変更.
tstring SH_GetPathFromIDList (LPCITEMIDLIST pidl)
{
tstring path ;
path.resize(MAX_PATH+10) ;
BOOL result = ::SHGetPathFromIDList(pidl,&path[0]) ;
return path.c_str() ;
}
tstring Test (void)
{
BROWSEINFO bi = { 0 } ;
bi.ulFlags |= BIF_RETURNONLYFSDIRS ;
bi.ulFlags |= BIF_NEWDIALOGSTYLE ;
bi.ulFlags |= BIF_NONEWFOLDERBUTTON ;
LPITEMIDLIST pidl = ::SHBrowseForFolder(&bi) ;
if (pidl == NULL) { return tstring() ; }
tstring path = ::SH_GetPathFromIDList(pidl) ;
::CoTaskMemFree(pidl) ;
return path ;
}
pszDisplayName を指定すると,選択されたフォルダ名が返る.
tstring disp_name ;
disp_name.resize(MAX_PATH) ;
bi.pszDisplayName = &disp_name[0] ;
// ... SHBrowseForFolde
std::tout << disp_name.c_str() << std::endl ;
初期フォルダ指定の追加.
int CALLBACK SH_BrowseCallback (HWND hwnd,UINT uMsg,LPARAM lParam,LPARAM lpData)
{
switch (uMsg) {
case BFFM_INITIALIZED :
::SendMessage(hwnd,BFFM_SETSELECTION,1,(LPARAM)(LPCTSTR)lpData) ;
return 1 ;
break ;
default :
return 0 ;
break ;
}
return 0 ;
}
{
// ...
tstring init_fold = init_fold_ ;
// ...
bi.lpfn = SH_BrowseCallback ;
bi.lParam = (LPARAM)init_fold.c_str() ;
LPITEMIDLIST pidl = ::SHBrowseForFolder(&bi) ;
// ...
}
Win10 に VS 6 インストール
今まで仮想マシンの WinXP で VC 6 を使用してきたが,ちょっと面倒なので Win10 環境に入れてみた.
使用したのは次の ISO .
en_visual_studio_6.0_professional_x86_dvd_224df581.iso
2021/04 に VS のダウンロードサイトで見つけた.
その時 Win7 環境などにインストールして動作することは確認済み.
インストール時,データベース関連を入れると止まると書かれていたので,外してインストール.
VB6開発環境をWindows 10にインストールする手順
VC 6 を簡単に確認した限りは何とか使えそう.
Win11 に VS 6 のインストール
Win11 22H2(デバッグできない時の設定も書いています)
2024/04/29
Win10 ,Win11 共に一部の制限があるものの VC 6 は特に問題なく使えている.
VC 6 から VC 2005 への移行
vc 6 から VC 201x への移行
vc 6 から VC 2022 への移行
OPENFILENAME
コンソール AP では,標準入力を使用していた.
#include "quotm.hxx"
#include "existff.hxx"
inline bool Test (void)
{
while(true) {
tstring str ;
{
tstring buf ;
buf.resize(1000) ;
std::terr << _T("file ...=") ;
std::tin.getline(&buf[0],std::streamsize(buf.size())) ;
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 << str << std::endl ;
}
}
return true ;
}
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
{
Test() ;
}
return 0 ;
}
以前作成した CFileDialog を使用したもの.
#include <afxwin.h>
#include "F_Dialog.hxx"
#include "quotm.hxx"
inline bool Test (void)
{
while(true) {
tstring str ;
{
str = ::FD_GetOpenFile(_T("./")) ;
if (str.empty()) { break ; }
}
{
if (::File_IsNothing(str)) { continue ; }
std::tout << str << std::endl ;
}
}
return true ;
}
CWinApp theApp;
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) {
std::terr << _T("error : AfxWinInit") << std::endl ;
nRetCode = 1;
}
else {
Test() ;
}
return nRetCode;
}
////////////////////////////////////////////////////////////////////////////////////////
#include <AfxExt.h>
#include "BrowseFF.cxx"
「開く」ダイアログを表示するだけのコード.
{
OPENFILENAME ofn = { 0 } ;
ofn.lStructSize = sizeof(OPENFILENAME) ;
if (!::GetOpenFileName(&ofn)) { return tstring() ; }
// ...
}
OPENFILENAME の指定が複雑なので,使いそうな内容でまとめてみた.
OPENFILENAME | |
lStructSize | sizeof(OPENFILENAME) |
hwndOwner | NULL の時,モードレスになる. CFileDialog では DoModal で求めている. |
lpstrFile | 選択されたファイル名が入る. OFN_ALLOWMULTISELECT の場合は,下のメモリイメージ. |
nMaxFile | lpstrFile で確保している領域の文字数 |
OFN_ALLOWMULTISELECT の場合の結果の lpstrFile .
0x02C00078 44 3a 5c 44 6f 63 75 6d 65 6e 74 5c 56 53 5c 56 D:\Document\VS\V 0x02C00088 53 5c 32 30 30 35 5c 54 5f 4f 70 65 6e 46 5c 54 S\2005\T_OpenF\T 0x02C00098 5f 4f 46 5f 4d 46 43 54 5f 4f 46 5f 4d 46 43 _OF_MFC.T_OF_MFC 0x02C000A8 2e 42 41 4b 54 5f 4f 46 5f 4d 46 43 2e 63 70 .BAK.T_OF_MFC.cp 0x02C000B8 70 54 5f 4f 46 5f 4d 46 43 2e 76 63 70 72 6f p.T_OF_MFC.vcpro 0x02C000C8 6a 54 5f 4f 46 5f 4d 46 43 2e 76 63 70 72 6f j.T_OF_MFC.vcpro 0x02C000D8 6a 2e 5a 31 37 30 53 30 2e 49 77 61 6f 2e 75 73 j.Z170S0.Iwao.us 0x02C000E8 65 72 00 00 00 00 00 00 00 00 00 00 00 00 er.............. 0x027E6B50 44 00 3a 00 5c 00 44 00 6f 00 63 00 75 00 6d 00 65 00 6e 00 74 00 5c 00 56 00 53 00 5c 00 56 00 D:\Document\VS\V 0x027E6B70 53 00 5c 00 32 00 30 00 30 00 35 00 5c 00 54 00 5f 00 4f 00 70 00 65 00 6e 00 46 00 5c 00 54 00 S\2005\T_OpenF\T 0x027E6B90 5f 00 4f 00 46 00 5f 00 4d 00 46 00 43 00 00 00 54 00 5f 00 4f 00 46 00 5f 00 4d 00 46 00 43 00 _OF_MFC.T_OF_MFC 0x027E6BB0 2e 00 42 00 41 00 4b 00 00 00 54 00 5f 00 4f 00 46 00 5f 00 4d 00 46 00 43 00 2e 00 63 00 70 00 .BAK.T_OF_MFC.cp 0x027E6BD0 70 00 00 00 54 00 5f 00 4f 00 46 00 5f 00 4d 00 46 00 43 00 2e 00 76 00 63 00 70 00 72 00 6f 00 p.T_OF_MFC.vcpro 0x027E6BF0 6a 00 00 00 54 00 5f 00 4f 00 46 00 5f 00 4d 00 46 00 43 00 2e 00 76 00 63 00 70 00 72 00 6f 00 j.T_OF_MFC.vcpro 0x027E6C10 6a 00 2e 00 5a 00 31 00 37 00 30 00 53 00 30 00 2e 00 49 00 77 00 61 00 6f 00 2e 00 75 00 73 00 j.Z170S0.Iwao.us 0x027E6C30 65 00 72 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 er.............. lpstrFile 0x02c10078 "D:\Document\VS\VS\2005\T_OpenF\T_OF_MFC\ReadMe.txt" char *
デバッガで OPENFILENAME_SIZE_VERSION_400 となる様にしたもの.
MFC 9 で bVistaStyle を FALSE とすると
VC 8 exe と同様の,左側がフォルダツリーではない表示のもの.
デフォルトの TRUE だと
COM を利用したもの?
Common Item Dialog
今度は MFC を使用しない方法.
::GetOpenFileName を使用する方法で OFN_ALLOWMULTISELECT を指定すると実行されなかった.
見た目のエラーにはならない?が,API を呼んで FALSE で抜けてくる.
::CommDlgExtendedError で調べると FNERR_INVALIDFILENAME だった.
存在しないファイル名などを与えるとうまくないみたい.
まだ何か足りないみたいで Win3.x 頃の表示になってしまった.
選択したファイル名などもスペースで区切られている.
OFN_ALLOWMULTISELECT を指定する時は OFN_EXPLORER も指定する必要があるみたい.
次の所に書かれていた.
OPENFILENAMEW structure (commdlg.h)
OFN_ALLOWMULTISELECT | OFN_EXPLORER の場合 lpstrFile に存在しないファイル名でも問題なさそう.
複数選択可能な「開く」ダイアログのコードは次の様な感じ.
tstring GetOpenFile (LPCTSTR default_name=_T("./"))
{
HWND hwnd = ::GetConsoleHwnd() ;
tstring str_file = default_name ;
str_file.resize(260*100) ;
OPENFILENAME ofn = { 0 } ;
{
ofn.lStructSize = sizeof(OPENFILENAME) ;
ofn.hwndOwner = hwnd ;
ofn.nMaxFile = DWORD(str_file.size()) ;
ofn.lpstrFile = &str_file[0] ;
ofn.Flags = OFN_ALLOWMULTISELECT | OFN_EXPLORER | OFN_HIDEREADONLY ;
}
if (!::GetOpenFileName(&ofn)) {
DWORD err = ::CommDlgExtendedError() ;
std::terr << ::To_tstring(u_32(err),16) << std::endl ;
return tstring() ;
}
tstring sel_file ;
{
sel_file = ofn.lpstrFile ;
// ...
}
return sel_file ;
}
拡張子のフィルタなどは指定していない.また,選択されたファイルを取得するコードもこれから.
選択されたファイルを取得するコード.
tstring String_Change (c_tstring& str_,const TCHAR src,const TCHAR dst)
{
tstring str = str_ ;
for (size_t index=0 ; index<str.size() ; index++) {
TCHAR ch = str[index] ;
if (ch == src) {
str[index] = dst ;
}
}
return str ;
}
tstring sel_file ;
{
sel_file = ofn.lpstrFile ;
sel_file = str_file ;
sel_file = ::String_Change(ofn.lpstrFile,_T('\x0'),_T('\n')) ;
sel_file = ::String_Change(str_file, _T('\x0'),_T('\n')) ;
sel_file = ::String_TrimBoth(sel_file) ;
}
ofn.lpstrFile は ASCIIZ となってしまうので,str_file をそのまま使用する必要がある.
Win3.x 形式の lpstrFile のダンプ.
0x02311F00 0043 003a 005c 0055 0053 0045 0052 0053 005c 0050 0055 0042 004c 0049 0043 005c C.:.\.U.S.E.R.S.\.P.U.B.L.I.C.\.
0x02311F20 0044 004f 0043 0055 004d 0045 004e 0054 0053 005c 0020 0042 0061 0063 006b 0043 D.O.C.U.M.E.N.T.S.\. .B.a.c.k.C.
0x02311F40 0050 002e 0062 0061 0074 002e 006c 006e 006b 0020 0057 0049 004e 0031 0030 002d P...b.a.t...l.n.k. .W.I.N.1.0.-.
0x02311F60 007e 0031 002e 004c 004e 004b 0020 005a 0031 0037 0030 0044 004f 007e 0031 002e ~.1...L.N.K. .Z.1.7.0.D.O.~.1...
0x02311F80 004c 004e 004b 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 L.N.K...........................
区切りがスペースになるため,ファイル名などにスペースが含まれている場合は 8.3 形式 になる.
lpstrFilter を指定.
tstring filter ;
filter += _T("Executable Files (*.exe)|*.exe|") ;
filter += _T("All Files (*.*)|*.*|") ;
filter += _T("|") ;
filter = ::String_Change(filter,_T('|'),_T('\x0')) ;
OPENFILENAME ofn = { 0 } ;
{
ofn.lStructSize = sizeof(OPENFILENAME) ;
// ...
ofn.lpstrFilter = &filter[0] ;
}
コンソール AP のウィンドウハンドル
GetOpenFileName を調べていて,コンソール AP のウィンドウハンドルが必要になった.
ofn.hwndOwner の NULL の指定では,モードレスの動作になってしまう.
CFileDialog は DoModal 内で設定していて,通常の AP であればうまく動作する様になっている.
「コンソール AP ウィンドウハンドル」で検索すると次のものがあった.
How to obtain a Console Window Handle (HWND)
そこにあったサンプルを,関数として抜き出し.
con_wnd.hxx
2023/08/02
2023/03 に ::GetConsoleWindow を使用したので,その関連のまとめ.
VC 7 以降,WinCon.h に ::GetConsoleWindow が追加されている.
それで,con_wnd.hxx では VC 6 やそれ以降のものでもうまく通る様に変更している.
Win10 に GLUT インストール
2 年位前に Linux 環境 での GLUT はインストール した.
今回は Win10 環境に…
「Windows GLUT」で検索すると…
なかなかうまく書かれているものが見つからない.
次の所は古いまま?
GLUT – The OpenGL Utility Toolkit
以前見た時は更新されていない様に思ったが…
freeglut
そこからのリンク
freeglut Windows Development Libraries
その中の freeglut 3.0.0 MSVC Package が欲しかったもの.
…/bin/freeglut.dll を c:\Windows\SysWOW64 にコピー.
また,glut32.dll の頃の exe も動作する様に …\SysWOW64\glut32.dll としてもコピー.
…/bin/x64/freeglut.dll は c:\Windows\System32 にコピー.
これで,以前作成した exe がそのまま動作することを確認.
glut.h と freeglut*.h は,次の …\PlatformSDK\include\gl にコピー.
VC 8 C:\Program Files (x86)\Microsoft Visual Studio 8\VC\PlatformSDK\Include\gl
VC 9 C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include\gl
VC10 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include\gl
VC11 C:\Program Files (x86)\Windows Kits\8.0\Include\um\gl
VC12 C:\Program Files (x86)\Windows Kits\8.1\Include\um\gl
VC14 C:\Program Files (x86)\Windows Kits\8.1\Include\um\gl
VC141 C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\um\gl
VC142 C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\um\gl
freeglut.lib は次の所にコピー.
C:\Program Files (x86)\Microsoft Visual Studio 8\VC\PlatformSDK\Lib
C:\Program Files\Microsoft SDKs\Windows\v6.0A\Lib
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Lib
C:\Program Files (x86)\Windows Kits\8.0\Lib\win8\um\x86 , x64
C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x86 , x64
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0\um\x86 , x64
2021/12/24
glut.h と freeglut*.h,freeglut.lib のコピー先は,お使いの環境によって異なります.
10.0.19041.0 は 2021/05 の頃での設定によるものです.
2021/12 では,10.0.22000.0 にコピーする必要があります.
https://itl.mish.work/Iwao/Doc/algo/to_thick/glut.htm
2023/11/02
VC インクルードパスの確認方法
2024/07/25
サンプルのコードを用意.t_c_ut_2024_07_25.zip
VC 6 ではそのままビルドできます.VC 2019 までは dsp からのアップグレードで可能です.
Linux 環境では次の様に入力して a.out の出力が可能です.
g++ t_c_ut_1.cpp -lGL -lGLU -lglut
「iPhone 3D プログラミング」にあるコードを使用しています.
Synology NAS Joomla! の更新
MNP
2909 の端末の調子が悪くなったので MNP .
BIGLOBE モバイル で…
2021/05/21 に問合せをかけると,
今ある「データ SIM」から「音声通話 SIM」への変更はできない.
一度「データ SIM」を「解約」して,新規に「申し込む」必要がある.
BIGLOBE の ID はそのまま引き継がれ,メールアドレス(xxx@xxx.biglobe.ne.jp)もそのまま使える.
支払い方法も引き継がれ,残っている g8 power lite の残額も継続される.
「音声通話 SIM」のため「本人確認書類」が必要になる(免許証などを写真で撮ってアップロード).
少し面倒だが,これで幾つかの「特典」が受けられるようになるみたい.
今の携帯電話会社に MNP 予約番号を発行してもらった.
サイト でいろいろと確認すると,予約番号の期限が 12 日以上 ないと,もう一度取り直さなければならないらしい.
2021/05/24
申し込みを受け付けてもらえる所に電話(0120-996-962).
すると「データ SIM」の「解約」は別の窓口(0120-86-0962)で,手続きが終わり次第電話もらえるとのこと.
欲しかった端末も入荷していて,午前中でほぼ終わった.
午後になり「本人確認書類」をアップロード.
端末が届くまではしばらくかかるそうだが,今ある回線は,すぐに使えなくはならない?
2021/05/25
「本人確認手続き完了」のメールが届いた.
今ある「データ SIM」回線は使えなくなった.
2021/05/26
スマートフォンなどが届いた.
SIM を取り付けて,最低限の設定まで.
この段階では MNP が切り替わってないので,電話をかけると旧携帯電話に着信する.
Web で MNP の切替え.すぐに新しい方への着信が確認できた.
スマートフォンのデータはまだほとんど設定していないが,電話機としてはすぐ使える様になった.
旧データ SIM は,新しい「シェア SIM」に入れ替えて今までと同様に使える様になった.
std::vector::data()
今まで VC 14 リリース版などでは通っていたコード.
VC 8 でビルドした exe で,配列の要素が空の時に終了してしまう.
MapiMessage message ; memset(&message,0,sizeof(message)) ; message.nFileCount = ULONG(fileDescA.size()) ; message.lpFiles = &fileDescA[0] ; message.nRecipCount = ULONG(recipDescA.size()) ; message.lpRecips = &recipDescA[0] ;
&fileDescA[0] で vector の先頭を参照することがうまくないみたい.
次の様に data() を使える環境ならば良さそう.
message.nFileCount = ULONG(fileDescA.size()) ; message.lpFiles = fileDescA.data() ;
使えない場合は,空でないことを確認する必要がある?
if (fileDescA.size() > 0) { message.nFileCount = ULONG(fileDescA.size()) ; message.lpFiles = &fileDescA[0] ; }
Ubuntu Linux Station
先日 Linux Station がうまく動作しなくなったように思ったが…
ファームアップデート後,試しに起動するとうまくいった.
先日は,メモリが足りなかったとかだったのか?
GLUT を使える様に インストール .
sudo apt install freeglut3 freeglut3-dev
ASUSTOR NAS Linux Center Debian 環境の a.out を実行.
ASUS ルータ OpenVPN 設定
以前に設定 したが,ポートを変更して再度設定.
いつからかはわからないが,ルータのファームの更新で OpenVPN のポート設定が表に出ている.
今までデフォルトの 1194 に設定していて,ルータの「システムログ」に変なアクセスが残っていた.
「サーバーポート」を「61940」などに変更.
「OpenVPN 設定をファイルにエクスポート」で「エクスポート」.
私の環境の様に au ひかりの場合は,出力した ovpn ファイルの IP アドレスの部分を必要に応じて変更.
私の環境では,IP アドレスはほぼ 27.92.xxx.xxx に固定されているのでそれを指定.
固定されていない環境の場合は,ルータの DDNS 機能 を利用できます.
IP アドレスの部分を xxxx.asuscomm.com に書き換えます.
ovpn ファイルをメールで送信.
あとは 以前と同様 .
enc_temp_folder
プロジェクトのソースをバックアップしていると,見慣れないフォルダ enc_temp_folder が…
その中には,先日編集した共通のソース combi_f.hpp が存在している.
ソースの中身は正規のものと比べると少し古い.
「enc_temp_folder」で検索すると,VS がクラッシュした時に生成されることがあるみたい.
確かに先日クラッシュした記憶がある.
が,その時バックアップが存在していると言う様なメッセージは気づかなかった.
原因はわかったので,削除することに.
外部から NAS へのアクセスの確認
最近 NAS への攻撃が多いみたいで,ちょっとまとめました.
自分の LAN 環境が,どこまで(どの様に)外部に公開されているかの確認方法です.
先ず グローバル IP を調べます.
私が用意した,次の所でも確認できます.
https://itl.mish.work/i_Tools/tiny/variable/
スマートフォンなどで,LAN とは別の回線を使用してグローバル IP に対して接続します.
接続できなければ OK です(表示内容はブラウザにより異なります).
以降は,接続された場合の表示例と,簡単な説明です.
幾つかの画像は NAS のデモサイトに一度入って,サインアウトしたものです.
ASUSTOR NAS
あまり好ましくはないですが,意図した動作ならば問題ありません.
できれば,使用している NAS がわからない様な空のページの html を用意することをお勧めします.
管理画面サインイン
グローバル IP に,NAS のデフォルトのポート番号を指定してのアクセスも確認してください.
例えば //27.92.169.109:5000/ など.
これらの様な管理画面の入り口が表示される場合は注意が必要です.
これらの NAS は,ポート番号を変更してください.
また,パスワードは必ず強力なものにします.できればデフォルトの管理者アカウントは無効にします.
LAN からのみ接続可能な様に設定することがお勧めです.
私の環境では,ルータ の VPN 機能 を利用して接続しています.
これらを書いている時,次の様な記述を見つけました.
QNAP NASを無防備にインターネットに直接接続してはいけない理由とは
以降は,私の環境に対しての怪しいアクセスです.
phpMyAdmin に対するアクセス
/phpMyAdmin , /phpmyadmin , /pma , /myadmin , /MyAdmin の scripts/setup.php .
WordPress をセットアップした時にインストールした phpMyAdmin は,削除することがお勧めです.
WordPress
/wp-admin/ , /wp-content/ , /wp-content/plugins
恐らくプラグインを狙ったものと思いますが,常に最新にしておくことくらいでしょうか.
/wp-login.php も多くあります.
利用していないものはなるべく削除してください.
他に /FCKeditor/ へのアクセスも多いです.
2021/05/23
「スマートホームスキャナー」で定期的にチェックすることもお勧めです.
以下は,前に私が書いた記事になります.
https://mish.hatenablog.jp/entry/2020/12/16/smart_home_scanner
ADM に入れない
証明書の関係をいろいろ弄ったら,ADM に入れなくなってしまった.
NAS を再起動しても変わらず.
安全な接続ができませんでした 192.168.1.??:????? への接続中にエラーが発生しました。Peer’s Certificate has been revoked. エラーコード: SEC_ERROR_REVOKED_CERTIFICATE 受信したデータの真正性を検証できなかったため、このページは表示できませんでした。 この問題をウェブサイトの管理者に連絡してください。 エラーの説明...
スマートフォンの AiMaster では入れる.
検索すると,Firefox のガードに引っ掛かっているみたい.
Edge で開くと,入れた.
「設定」-「証明書管理者」で「asustor.com (デフォルト)」となっている方を「既定の証明書として設定」.