この画面は、簡易表示です
MFC を使用しないコードに書き直していて,代入できない構造体が欲しくなった.
オリジナルのコードは 20 年以上前のもので,CRegKey が簡単には使えなかった?頃.
「C++ クラス 代入できなくする」で検索.
コピー禁止を徹底させるNoncopyableクラス
More C++ Idioms/コピー禁止ミックスイン(Non-copyable Mixin)
明示的に既定された関数および削除された関数
MFC の CObject も同様と思いソースを見ると,やはり private になっている.
C++11 以降では =delete も使える.
関数のdefault/delete宣言
wiki C++11
これらを調べていて,次の所を見つけた.
旧時代のC言語を使うのはそろそろやめよう。
2016年、C言語はどう書くべきか (前編)
2016年、C言語はどう書くべきか (後編)
幾つかは既に意識しているが,Windows に依存する部分はなかなかできてない.
あまり使わないと,すぐ忘れてしまう…
1999/10 に作成したプロジェクトを変更していて,ダイアログバーにコントロールを追加.
ClassWizard で CMainFrame に対してイベント処理を追加すれば良い.
今回の SDI.exe は,ビューでの処理のみなので「再描画」のコマンドメッセージを Post している.
void CMainFrame::OnUpdateRx()
{
PostMessage(WM_COMMAND,ID_REDRAW,0) ;
}
ビューでは次の様にしてコントロールにアクセスしている.
CMainFrame* pMain = (CMainFrame*)AfxGetApp()->m_pMainWnd ;
CDialogBar* dlgBar= &pMain->m_wndMyDialogBar ;
CComboBox* font = (CComboBox*) dlgBar->GetDlgItem(IDC_FONT_NAME) ;
CEdit* text = (CEdit*) dlgBar->GetDlgItem(IDC_STRING) ;
CEdit* e_rx = (CEdit*) dlgBar->GetDlgItem(IDC_RX) ;
CEdit* e_ry = (CEdit*) dlgBar->GetDlgItem(IDC_RY) ;
ダイアログバーの追加手順は次の所.
https:/
VC 2005 で作成した exe がうまく起動しないと連絡が入った.
すぐに dll などがないためとわかり,VC 2005 SP1 vcredist_x86.exe を入れて対応してもらった.
https:/
それで,Win11 環境の c:\Windows\WinSxS\ の MFC80*.dll を見ると,それらしいものが見当たらない.
Win10 では …\WinSxS\ に存在する.
explorer で検索すると Win11 では ..\WinSxS\Fusion\ 以下になっている.
Fedora 環境に VS Code のインストール.
How to Install Visual Studio Code on Fedora 36 Linux
最初の次のコマンドで,時間がかかっている.
sudo dnf upgrade –refresh
それで調べているともっと簡単と思われる情報が…
Visual Studio Code – Fedora Project Wiki
次のコマンドでインストール.
flatpak install https://flathub.org/repo/appstream/com.visualstudio.code.flatpakref
何とか入った.
が,どうやって使うのか…
Ubuntu 環境は OS が古く,20.04 への更新から.
さらに flatpak をインストールする必要があった.
sudo apt install flatpak
そして,
flatpak install https://flathub.org/repo/appstream/com.visualstudio.code.flatpakref
こちらの方は「日本語化」のインストールの案内が自動で出てきた.
Fedora 環境では,手動で追加.
「言語拡張機能の参照」をクリック.すると,左に「C#」などがリストされる.
.NET のインストール.
Linux に .NET をインストールする
dotnet と入力すると,sudo snap install dotnet-sdk と出てきた.
これは違った?
次の所にある C# のコードを作成して VS Code で「デバッグなして実行」.
コンソール アプリ
すると,また同じ所に.
Ubuntu に .NET SDK または .NET ランタイムをインストールする
順に入れたが…
wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.deb
sudo apt-get update && sudo apt-get install -y dotnet-sdk-6.0
よくわからない.
次の所を参考にコマンドで…
Linux での開発用に C# を設定する
次のコマンドを入力すると…
dotnet new console
そして,
dotnet run
何とか,コンパイル,実行できることは確認できた.
今度は Fedora 環境に.
Fedora に .NET SDK または .NET ランタイムをインストールする
sudo dnf install dotnet-sdk-6.0
dotnet new console と dotnet run
2022/11/25
Windows 環境だと…
dotnet new <テンプレート>
VS Code はエディタとして使用する程度?
チュートリアル: Visual Studio Code を使用して .NET コンソール アプリケーションを作成する
うまく動作しない.ターミナルからでは dotnet コマンドへのパスが通っていない?
「.NET なんとか」のメモ.
.NET Framework
.NET (.NET Core)
.NET MAUI
.NET CLI
VS などが入っている環境だと,次のコマンドで SDK バージョンを確認できる.
dotnet –list-sdks
Visual C++ で基本的なファイル I/O を実行する
C++/CLI プロジェクトを .NET Core または .NET 5 に移植する方法
C++/CLI
「プロジェクト テンプレート」で「CLR 空のプロジェクト(.NET Framework)」を選択.
次の様な内容のソースを追加.
//#include "pch.h"
using namespace System;
int main(array<System::String^>^ args)
{
Console::Write("test");
return 0;
}
次の所のコードと std::cin との混在.
ファイル処理と I/O (C++/CLI)
// file_info.cpp
// compile with: /clr
using namespace System;
using namespace System::IO;
#include "ask_cli.hxx"
#include "str_CLI.hxx"
bool Draw_FileInfo (c_tstring& file_name)
{
String^ file = ::to_gcString(file_name) ;
FileInfo^ fi = gcnew FileInfo(file) ;
Console::WriteLine("file size: {0}", fi->Length);
Console::Write ("File creation date: ");
Console::Write ( fi->CreationTime.Month.ToString());
Console::Write (".{0}", fi->CreationTime.Day.ToString());
Console::WriteLine(".{0}", fi->CreationTime.Year.ToString());
Console::Write ("Last access date: ");
Console::Write ( fi->LastAccessTime.Month.ToString());
Console::Write (".{0}", fi->LastAccessTime.Day.ToString());
Console::WriteLine(".{0}", fi->LastAccessTime.Year.ToString());
return true ;
}
int main()
{
array<String^>^ args = Environment::GetCommandLineArgs();
if (args->Length > 1) {
tstring file_name = ::to_tstring(args[1]) ;
::Draw_FileInfo(file_name) ;
}
else {
while(true) {
tstring path = ::ask_cli(_T("file ... ? =")) ;
if (path.empty()) { break ; }
::Draw_FileInfo(path) ;
}
}
return 0;
}
昨日から VC6 で開いたままだったプロジェクトをビルドすると,あまり見慣れないエラーが…
--------------------Configuration: AsTrmM - Win32 Debug--------------------
Compiling...
HProRNew.cpp
t:\develop\_.src\...\hprornew.cpp(113) : fatal error C1010: unexpected end of file while looking for precompiled header directive
Error executing cl.exe.
AsTrmM.exe - 1 error(s), 0 warning(s)
他の環境で試そうとプロジェクトを閉じようとすると,保存するかの問合せが入った.
保存された dsp と先日バックアップしたそれと比べると,不要な cpp が追加されていた.
ソースを開いた時,操作ミスで間違ってビルド対象に cpp が追加されてしまったみたい.
不要な cpp をプロジェクトから外して対応.うまくいった.
私の場合,自動生成される以外のソースは,次の様な複数の cpp をプロジェクトに追加して運用しています.
ComUse01.cpp
#include "StdAfx.h"
#include "ComPrj00.hpp"
#include "Point.cxx"
#include "Matrix.cxx"
// ...
ComPrj00.hpp
#include "i3DV.h" // App.h
#include "ColorHSV.hxx"
// ...
Win7 のライセンス認証がうまく通らない.「エラー コード 0x80072F8F」になってしまう.
一時的なものか,それともどこかが壊れているのかと思いそのままになっていた環境.
先日,動作確認のために Win7 のクリーンな環境が必要になり,仮想マシンにインストール.
その時も同様のエラーだったので,電話で取得した.
それで,通らなかった環境の電話での手順.
「ライセンス認証の手続きを行う他の方法を表示します」を選択.
「自動電話システムを使用します」を選択.
「日本」を選択.
表示された電話番号にかけて,電話で「インストール ID」を入力.
正しく入力できると「確認 ID」が案内される.
「確認 ID」を入力して「次へ」.
How To Activate Windows 7 by Phone Step-by-Step Guide
Windows の製品ライセンス認証 – オンライン サポートの電話番号
API などをテストするために,個人的に使用している C++ のコード.
#include <clocale>
#include <iostream>
#include "_tdefine.hxx"
#include "cmd_line.hxx"
#include "ask_cli.hxx"
//#include "ask_path.hxx"
bool test (c_tstring& str)
{
std::terr << str << std::endl ;
return true ;
}
inline bool call_func (int argc,TCHAR* argv[])
{
if (argc > 1) {
for (int index=1 ; index<argc ; index++) {
tstring av = argv[index] ;
::test(av) ;
}
}
else {
while(true) {
tstring path ;
{
#ifdef OFN_filter_All
path = ::ask_path(false) ;
#else
path = ::ask_cli(_T("file ... ? =")) ;
#endif
}
if (path.empty()) { break ; }
::test(path) ;
}
}
return true ;
}
int _tmain (int argc,TCHAR* argv[])
{
_tsetlocale(LC_ALL,_T("")) ;
{
::reg_argv (argc,argv) ;
}
{
::call_func(argc,argv) ;
}
{
::test(_T("Test")) ;
}
::ask_wait() ;
return 0 ;
}
//#include "messbar.cxx"
インクルードしているファイルは cpp6_hxx.zip にある.
上のコードを test.cpp などとして保存し,同じ所に zip を展開.
g++ test.cpp などでコンパイル可能.
これらを使用したコード.
https:/
Synology NAS の Cloud Sync のログに,ダウンロードできないファイルが幾つかあった.
対象のファイルは SmpTxt.zip で,その中の SmpTxt.exe がうまくない様子.
VC 6 でビルドしたものがマルウェアなどとして検出されている.VC 8 でビルドしたものは問題ない.
Vector に登録できているので誤検出だろうと思うが,どうしたものか.
i_ShellExt 未定義ドキュメントのサムネイルを表示可能に
2022/09/22
VC のバージョンをあげて対応することに.また SmpTxt.zip 内の VC 6 版は削除予定.
2022/09/26
SmpTxt_2022_09.zip
昨日の午後になって,SSD の温度がいつもより高いことに気づいた.
今まで,使っていない時は 50~60℃位だったのが,70℃以上になっている.
最近の更新は,SSD のファームのアップデートと,月齢の Windows Update .
どちらかが影響しているものと思われるが,何とも言えない?
表示だけの問題であれば良いが…
以前まとめたもの.
ClipView.doc
MSDNのドキュメントは,”Creating a Clipboard Viewer Window” で見つかる.
https:/
mk:@MSITStore:j:\MSDN\ipc.chm::/hh/winbase/clipbrd_47ok.htm
WM_CREATE ビューアとしての登録
NextWnd = ::SetClipboardViewer(hWnd) ;
WM_DESTORY ビューアの登録解除
::ChangeClipboardChain(hWnd,NextWnd) ;
WM_CHANGECBCHAIN 他のビューアが登録解除された
if ((HWND)wParam == NextWnd) { NextWnd = (HWND)lParam ; }
else if (NextWnd != NULL) { ::SendMessage(NextWnd,uMsg,wParam,lParam) ; }
WM_DRAWCLIPBOARD クリップボードの内容が更新された
// 描画または相当の動作
if (NextWnd != NULL) { ::SendMessage(NextWnd,uMsg,wParam,lParam) ; }
VC 2022 でビルドしようとすると,次の様なエラー.
—————————
Microsoft Visual Studio
—————————
オブジェクト参照がオブジェクト インスタンスに設定されていません。
—————————
OK
—————————
プロジェクトの設定などを見直しても特に怪しい部分はなさそう.
ビルド時に生成される幾つかのファイルを手動で削除しても特に変わらない.
さっきまで動作していた VC 2019 も同様のエラーに.
以前うまく動作しているはずのプロジェクトをコピーして,ビルドしようとしても同様.
こうなると,プロジェクトの設定ではなく,環境っぽい.
PC を再起動してうまく動作する様になった.
自前の Doc::UpdateCommand で CCmdUI の処理を実装して,イベントが来なかった.
原因は,範囲の指定が間違っていた.
ON_UPDATE_COMMAND_UI_RANGE (ID_Start, ID_End, OnUpdateCmd)
すぐに気づかなかったのでメモ.
ある AP の動作で,ツールバーの一部のコマンドが入らない.
いろいろと確認すると,x64 exe で,リリース版,デバッグ版は関係ない.
x86 exe は問題ない(ちゃんと機能する).
2015/11 の exe でも同様の現象を確認.
メニューの同様のコマンドは問題ない.
ツールバーがちらつくので,UPDATE_COMMAND_UI の実装でうまくない部分があると思われる.
一時的に Disable にしているなど…
調べるのに時間がかかりそうなので,取りあえずメモ.
状態により,次の矛盾したものが呼ばれることがあったため修正.
pCmdUI->Enable(FALSE) ;
pCmdUI->Enable(TRUE) ;
DS220+ を追加 して,その後いろいろと設定を変更したためか,TS-253D の証明書がうまく更新されない.
「コントロールパネル」-「セキュリティ」-「SSL 証明書…」-「証明書更新」でエラーになる.
原因は,以前「代替名」で指定していた jml.mish.work などがうまくなかったものと思われる.
現在 jml.mish.work は DS220+ の方に割り当てている.
もう一度,「証明書の交換」から入って,次の様に指定することで取得できた.
同様に AS5202T の方も…
こちらの場合は一度削除する必要があった.
2022/06/13
Synology NAS DS116 は,まだ完全に移行できていないので,ポートマッピングの設定を一時的に変更して取得.
次の画像は「既存の認証を書き換えます」としたもの.
「サブジェクトの指定の別名」での区切り文字(セミコロン)が間違っているため,「完了」が押せない.
Win.ini がなくて MAPI が動作しなかった(Disable だった)と報告を受けた.
4 年位前に書き直した MAPI を使用したコードではチェックしない様にしたが,古いコードもまだ存在する.
それらのコードは MFC のコード docmapi.cpp を参考にしたもの.
VC 2022 のコードを見ると,Win.ini の [MAIL] の MAPI をチェックしている.
最初のコードを書いた 20 年以上前(VC 98)とそれほど変わっていない.
何もインストールしていない環境で Win.ini は存在する?
Win10 Pro 21H2 では次のものが存在している.
何かをアンインストールすると削除されることがあるのか?
2022/05/06 に不良セクタが発生したドライブ.この時,プチフリーズの様な現象で気づいた.
すぐにデータなどは他のデバイス( \\DS220\Public\ )にコピーしたので,特に失われたものはないと思う.
その後テンポラリ( VC の Fallback や SymbolCache )として使って様子を見ていた.
時々,少し遅くなることはあったが,エラーになるようなことはなかったと思う.
前回,この PC の別のドライブが壊れた時のものは次の所.
https:/
今日 CrystalDiskInfo を見ると「異常」に.
イベントビューアにも「重大」として記録されている.
もうダメみたい.どうしたものか?
* 不良セクタなどが発生した場合,バックアップがない場合のみコピーして,アクセスしない様にして下さい.
「デュプリケーター」でコピーすることにより,失うものを最小限にすることができるかもしれません.