2025年1月
 1234
567891011
12131415161718
19202122232425
262728293031  

カテゴリー

アーカイブ

ブログ統計情報

  • 103,605 アクセス


MFC AP で .NET の利用

MFC ダイアログ AP を C++/CLI に.
VC 2010 で,MFC ダイアログベースのスケルトンを作成.
リストボックスを追加して,コントロールの変数を割り当て.
プロジェクトの「プロパティ」で「共通言語ランタイム サポート(/clr)」に変更.
ダイアログのソースに次のものを追加.

#include	"enumfile.hxx"
#include	"vtst_MFC.hxx"
#include	"str_CLI.hxx"

#using		<System.dll>
#using		<mscorlib.dll>

OnInitDialog に次のコードを追加.

	{
		v_tstring	files = ::EnumFiles(_T("./"),_T("*.*")) ;
		::ToListBox(files,&m_CtrlListFiles) ;
		}
	{
		array<System::String^>^ gfile = System::IO::Directory::GetFiles(_T("./"));
		v_tstring	files ;
		for (int i = 0; i<gfile->Length; i++) {
			tstring	file = ::to_tstring(gfile[i]) ;
			files.push_back(file) ;
			}
		::ToListBox(files,&m_CtrlListFiles) ;
		}

MFC AP に「共通言語ランタイム サポート(/clr)」追加


「共通言語ランタイム サポート(/clr)」とすることで良いならば,コンソール AP ではどうなのか?
空のコンソール AP を作成して,次の様なコード.

#include	"enumfile.hxx"
#include	"str_CLI.hxx"

#using  	<System.dll>

bool	test	(c_tstring& str)
{
	tstring	fold_ = str ;
	{
		if (::File_IsDirectory(fold_))	{	;				}
		else				{	fold_ = ::Path_GetDir(fold_) ;	}
		}
	std::terr << fold_ << std::endl ;
	{
		v_tstring	files = ::EnumFiles(fold_,_T("*.*")) ;
		for (size_t index=0 ; index<files.size() ; index++) {
			std::terr << files[index] << std::endl ;
			}
		}
	{
		System::String^	fold = ::to_gcString(fold_) ;
		array<System::String^>^ gfile = System::IO::Directory::GetFiles(fold);
		for (int i = 0; i<gfile->Length; i++) {
			System::String^	file = gfile[i] ;
			System::Console::WriteLine(file) ;
			}
		}
	return	true ;
	}

int _tmain(int argc, _TCHAR* argv[])
{
	::test(_T("./")) ;
	return 0;
	}

Win32 コンソール AP C++  /clr に
::GetOpenFileName使用 した 方法 も可能だったが…
C++/CLI コンソール AP で GetOpenFileName を使用
::SHBrowseForFolder では,止まってしまう?


プロジェクトの作成で「CLR コンソール アプリケーション」として,main 関数を次の様にしたもの.

int main(array<System::String ^> ^args)
{
	{
	//	::call_func(argc,argv) ;
		::call_func() ;
		}
	{
		::test(_T("Test")) ;
		}
	::ask_wait() ;
	return 0;
	}

これは,ビルドするとよくわからないエラー.

1>------ ビルド開始: プロジェクト: T_CLR_2, 構成: Debug Win32 ------
1>  T_CLR_2.cpp
1>  EnumFile.hxx MessageBar  No Support
1>  .NETFramework,Version=v4.0.AssemblyAttributes.cpp
1>T_CLR_2.obj : error LNK2028: 未解決のトークン (0A000665) "extern "C" unsigned long __stdcall CommDlgExtendedError(void)" (?CommDlgExtendedError@@$$J10YGKXZ) が関数 "class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > __cdecl FD_GetOpenFile(struct HWND__ *,wchar_t const *,wchar_t const *,wchar_t const *)" (?FD_GetOpenFile@@$$FYA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@PAUHWND__@@PB_W11@Z) で参照されました。
1>T_CLR_2.obj : error LNK2028: 未解決のトークン (0A000695) "extern "C" int __stdcall SHGetPathFromIDListW(struct _ITEMIDLIST const *,wchar_t *)" (?SHGetPathFromIDListW@@$$J18YGHPBU_ITEMIDLIST@@PA_W@Z) が関数 "class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > __cdecl SH_GetPathFromIDList(struct _ITEMIDLIST const *)" (?SH_GetPathFromIDList@@$$FYA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@PBU_ITEMIDLIST@@@Z) で参照されました。
1>T_CLR_2.obj : error LNK2028: 未解決のトークン (0A00069F) "extern "C" void __stdcall CoTaskMemFree(void *)" (?CoTaskMemFree@@$$J14YGXPAX@Z) が関数 "class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > __cdecl Browse_Folder(struct HWND__ *,wchar_t const *,wchar_t const *)" (?Browse_Folder@@$$FYA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@PAUHWND__@@PB_W1@Z) で参照されました。
1>T_CLR_2.obj : error LNK2028: 未解決のトークン (0A0006B0) "extern "C" struct HWND__ * __stdcall FindWindowW(wchar_t const *,wchar_t const *)" (?FindWindowW@@$$J18YGPAUHWND__@@PB_W0@Z) が関数 "struct HWND__ * __cdecl GetConsoleHwnd(void)" (?GetConsoleHwnd@@$$FYAPAUHWND__@@XZ) で参照されました。
1>T_CLR_2.obj : error LNK2028: 未解決のトークン (0A00070A) "extern "C" struct _ITEMIDLIST * __stdcall SHBrowseForFolderW(struct _browseinfoW *)" (?SHBrowseForFolderW@@$$J14YGPAU_ITEMIDLIST@@PAU_browseinfoW@@@Z) が関数 "class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > __cdecl Browse_Folder(struct HWND__ *,wchar_t const *,wchar_t const *)" (?Browse_Folder@@$$FYA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@PAUHWND__@@PB_W1@Z) で参照されました。
1>T_CLR_2.obj : error LNK2028: 未解決のトークン (0A000710) "extern "C" int __stdcall GetOpenFileNameW(struct tagOFNW *)" (?GetOpenFileNameW@@$$J14YGHPAUtagOFNW@@@Z) が関数 "class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > __cdecl FD_GetOpenFile(struct HWND__ *,wchar_t const *,wchar_t const *,wchar_t const *)" (?FD_GetOpenFile@@$$FYA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@PAUHWND__@@PB_W11@Z) で参照されました。
1>T_CLR_2.obj : error LNK2028: 未解決のトークン (0A000741) "extern "C" long __stdcall SendMessageW(struct HWND__ *,unsigned int,unsigned int,long)" (?SendMessageW@@$$J216YGJPAUHWND__@@IIJ@Z) が関数 "extern "C" long __cdecl SendMessage(struct HWND__ *,unsigned int,unsigned int,long)" (?SendMessage@@$$J0YAJPAUHWND__@@IIJ@Z) で参照されました。
1>T_CLR_2.obj : error LNK2019: 未解決の外部シンボル "extern "C" long __stdcall SendMessageW(struct HWND__ *,unsigned int,unsigned int,long)" (?SendMessageW@@$$J216YGJPAUHWND__@@IIJ@Z) が関数 "extern "C" long __cdecl SendMessage(struct HWND__ *,unsigned int,unsigned int,long)" (?SendMessage@@$$J0YAJPAUHWND__@@IIJ@Z) で参照されました。
1>T_CLR_2.obj : error LNK2019: 未解決の外部シンボル "extern "C" int __stdcall SHGetPathFromIDListW(struct _ITEMIDLIST const *,wchar_t *)" (?SHGetPathFromIDListW@@$$J18YGHPBU_ITEMIDLIST@@PA_W@Z) が関数 "class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > __cdecl SH_GetPathFromIDList(struct _ITEMIDLIST const *)" (?SH_GetPathFromIDList@@$$FYA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@PBU_ITEMIDLIST@@@Z) で参照されました。
1>T_CLR_2.obj : error LNK2019: 未解決の外部シンボル "extern "C" void __stdcall CoTaskMemFree(void *)" (?CoTaskMemFree@@$$J14YGXPAX@Z) が関数 "class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > __cdecl Browse_Folder(struct HWND__ *,wchar_t const *,wchar_t const *)" (?Browse_Folder@@$$FYA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@PAUHWND__@@PB_W1@Z) で参照されました。
1>T_CLR_2.obj : error LNK2019: 未解決の外部シンボル "extern "C" struct _ITEMIDLIST * __stdcall SHBrowseForFolderW(struct _browseinfoW *)" (?SHBrowseForFolderW@@$$J14YGPAU_ITEMIDLIST@@PAU_browseinfoW@@@Z) が関数 "class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > __cdecl Browse_Folder(struct HWND__ *,wchar_t const *,wchar_t const *)" (?Browse_Folder@@$$FYA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@PAUHWND__@@PB_W1@Z) で参照されました。
1>T_CLR_2.obj : error LNK2019: 未解決の外部シンボル "extern "C" unsigned long __stdcall CommDlgExtendedError(void)" (?CommDlgExtendedError@@$$J10YGKXZ) が関数 "class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > __cdecl FD_GetOpenFile(struct HWND__ *,wchar_t const *,wchar_t const *,wchar_t const *)" (?FD_GetOpenFile@@$$FYA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@PAUHWND__@@PB_W11@Z) で参照されました。
1>T_CLR_2.obj : error LNK2019: 未解決の外部シンボル "extern "C" int __stdcall GetOpenFileNameW(struct tagOFNW *)" (?GetOpenFileNameW@@$$J14YGHPAUtagOFNW@@@Z) が関数 "class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > __cdecl FD_GetOpenFile(struct HWND__ *,wchar_t const *,wchar_t const *,wchar_t const *)" (?FD_GetOpenFile@@$$FYA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@PAUHWND__@@PB_W11@Z) で参照されました。
1>T_CLR_2.obj : error LNK2019: 未解決の外部シンボル "extern "C" struct HWND__ * __stdcall FindWindowW(wchar_t const *,wchar_t const *)" (?FindWindowW@@$$J18YGPAUHWND__@@PB_W0@Z) が関数 "struct HWND__ * __cdecl GetConsoleHwnd(void)" (?GetConsoleHwnd@@$$FYAPAUHWND__@@XZ) で参照されました。
1>D:\Document\VS\VS\2010\T_CLI\Debug\T_CLR_2.exe : fatal error LNK1120: 外部参照 14 が未解決です。
========== ビルド: 0 正常終了、1 失敗、4 更新不要、0 スキップ ==========

どこかを設定を設定すれば良いのかもしれないが,ちょっとわからない.

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

「空のソリューション」がない

Win11 環境の VS 2022 の「新規作成」-「プロジェクト」で「空のソリューション」が表示されない.
VS 2022  「空のソリューション」が表示されない
VS 2019 や Win10 環境の VS 2022 では正しく表示される.


検索する と,どうもその様なことがあるみたい.
どうすると確実なのかはわからないが「Visual Studio Installer」で「変更」すれば良さそう.
「データの保存と処理」-「Azure Data Lake …」のチェックを外して「変更」して,表示されるようになった.
VS Installer  「変更」

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

Linux VS Code インストール

Fedora 環境に VS Code のインストール.
Fedora Linux に Visual Studio Code をインストールする方法
最初の次のコマンドで,時間がかかっている.
sudo dnf upgrade –refresh
それで調べているともっと簡単と思われる情報が…
Visual Studio Code – Fedora Project Wiki
次のコマンドでインストール.
flatpak install https://flathub.org/repo/appstream/com.visualstudio.code.flatpakref
何とか入った.
Fedora に VS Code のインストール
が,どうやって使うのか…


Ubuntu 環境は OS が古く,20.04 への更新から.
さらに flatpak をインストールする必要があった.
sudo apt install flatpak
そして,
flatpak install https://flathub.org/repo/appstream/com.visualstudio.code.flatpakref
Ubuntu 環境に VS Code のインストール
こちらの方は「日本語化」のインストールの案内が自動で出てきた.
Fedora 環境では,手動で追加.
VS Code  日本語化パッケージのインストール
「言語拡張機能の参照」をクリック.すると,左に「C#」などがリストされる.
VC Code に C# のインストール


.NET のインストール.
Linux に .NET をインストールする
dotnet と入力すると,sudo snap install dotnet-sdk と出てきた.
Ubuntu に 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
dotnet new console と dotnet run
何とか,コンパイル,実行できることは確認できた.


今度は Fedora 環境に.
Fedora に .NET SDK または .NET ランタイムをインストールする
sudo dnf install dotnet-sdk-6.0
dotnet new console と dotnet run
Fedora で dotnet new console と dotnet run


2022/11/25
Windows 環境だと…
dotnet new winforms
dotnet new <テンプレート>


VS Code はエディタとして使用する程度?
チュートリアル: Visual Studio Code を使用して .NET コンソール アプリケーションを作成する
うまく動作しない.ターミナルからでは dotnet コマンドへのパスが通っていない?

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

「.NET なんとか」

「.NET なんとか」のメモ.
.NET Framework
.NET (.NET Core)
.NET MAUI
.NET CLI


VS などが入っている環境だと,次のコマンドで SDK バージョンを確認できる.
dotnet –list-sdks
dotnet --info


Visual C++ で基本的なファイル I/O を実行する
C++/CLI プロジェクトを .NET Core または .NET 5 に移植する方法


C++/CLI
C++/CX
C++/WinRT


C++/CLI
「プロジェクト テンプレート」で「CLR 空のプロジェクト(.NET Framework)」を選択.
CLR .NET Framework
次の様な内容のソースを追加.

//#include "pch.h"

using namespace System;

int main(array<System::String^>^ args)
{
    Console::Write("test");
    return 0;
    }

VC 2022  CLR  プロパティ


次の所のコードと 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;
	}
Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

簡易 Web サーバ C#

System.Net.HttpListener.dll で比較的簡単にできるみたいなので,ちょっと調べてみた.


最初に見つけたのは次の所.
.NET TIPS 簡易Webサーバを実装するには?[2.0のみ、C#、VB]
Win10 C:\Windows\Microsoft.NET\Framework\v3.5\csc.exe でコンパイルして問題なく動作する.
そのままのコードでは,管理者として起動しなければならないのと,ルートが固定のため少し変更.

	string	root = @"c:\wwwroot\";	// ドキュメント・ルート
		root = @".\";
	string	prefix = "http://*/";	// 受け付けるURL
		prefix = "http://localhost:65432/" ;

これで exe を対象のルートにコピーして,起動させることができる.
HttpListener  C#


localhost ではなく 127.0.0.1 を指定すると //localhost:65432/… としてもアクセス可能.
prefix = "http://127.0.0.1:65432/" ;


参考にさせてもらった所.
https://yryr.me/programming/local-http-server.html
https://www.3ace-net.co.jp/blog/201304151845.html
https://d01tsumath.hatenablog.com/entry/2019/08/16/190000


これらをテストしていて,WebGL のページを表示すると,極端に遅くなる.
以前は FHD 環境だったが,先日から 4K でいろいろと…
そのため WebGL などのページを表示すると,GPU のメモリを大量に使用するみたい.
タスクマネージャの「専用 GPU メモリ」は 10 GB 程度になっているが,どこを使用しているの?
設定にもよるかもしれないが Firefox で次の所を表示すると「専用 GPU メモリ」の使用量が増えていく.
https://threejs.org/examples/#webgl_instancing_performance


C# のコードを C++/CLI に
簡易 Web サーバ C++/CLI
https://jml.mish.work/index.php/i-tools/web-svr.html

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

簡易 Web サーバ

次の様なものをブラウザで表示するために…
http://mish.html.xdomain.jp/Test/WebGL/Sphere.html


「Web Server for Chrome」は以前書いた.
http://test_wp.mish.work/2022/01/chrome-web.html
Win11 環境で同様に実行すると,次の様な表示が…
「Web Server for Chrome」は現在サポートされていません


開発環境には VS 2022 などが入っているので Python を使用した方法
…\Test\Web\WebGL\ に html などをコピー.
コマンドプロンプトで …\Test に移動.
py -m http.server
これで 127.0.0.1:8000 でアクセスできる.
終了は「Ctrl」+「C」.
py -m http.server


ASUSTOR NAS だと,
python -m http.server
python -m http.server
QNAP NAS や Synology NAS でも同様.Raspberry Pi にもあった.


検索すると System.Net.HttpListener.dll と言うのが見つかる.
それを使っていると思われる次の所からコードを拝借.
Windows 標準で Web サーバを起動する
System.Net.HttpListener.dll
勉強を兼ねて,ちょっとやってみるか.


2023/01/17
https://jml.mish.work/index.php/i-tools/web-svr.html
C++/CLI で作成した 簡易 Web サーバ

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

fatal error C1010

昨日から 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 が追加されていた.
C1010  不要な cpp が追加された dsp
ソースを開いた時,操作ミスで間違ってビルド対象に 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"
	//          ...


Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

Win7 ライセンス認証

Win7 のライセンス認証がうまく通らない.「エラー コード 0x80072F8F」になってしまう.
一時的なものか,それともどこかが壊れているのかと思いそのままになっていた環境.


先日,動作確認のために Win7 のクリーンな環境が必要になり,仮想マシンにインストール.
その時も同様のエラーだったので,電話で取得した.


それで,通らなかった環境の電話での手順.
Windows のライセンス認証
「ライセンス認証の手続きを行う他の方法を表示します」を選択.
WIndows のライセンス認証の手続きを行う方法を選択
「自動電話システムを使用します」を選択.
ライセンス認証の手続きを行うための電話番号
「日本」を選択.
Windows のライセンス認証 インストール ID
表示された電話番号にかけて,電話で「インストール ID」を入力.
正しく入力できると「確認 ID」が案内される.
Windows のライセンス認証 確認 ID
「確認 ID」を入力して「次へ」.
Windows  ライセンス認証に成功しました


How To Activate Windows 7 by Phone Step-by-Step Guide
Windows の製品ライセンス認証 – オンライン サポートの電話番号

Windows 11 Pro


2024/05/23
WinXP CHS をアクティベーションする必要があったので,Win7 の時と同様に実施.
電話をかけると,AI による対応になったみたい.
反応があまり良いとは言えないのでイライラするが,何とか認証できた.

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

高 DPI ペンの幅

引き続きやっているが,なかなか難しい.
左は「非対応.exe」を「プロパティ」で「アプリケーション」にしたもの.
LOGPEN 100% 200%
0.2 mm の指定で印刷する場合は問題ないが,27 インチ 4K では 1 ピクセルになり非常に見辛い.


今度は,VC 12 以降で「モニターごとの高い DPI 認識」としたもの.
LOGPEN Win7 , 8.1
Win7 では「非対応.exe」でも「アプリケーション」と指定したものの様な動作?
8.1 以降は,「DPI 認識」で指定したものが効いている?
VC 12 以降 「マニフェスト ツール」-「DPI 認識」


4K 環境の Win10 で「非対応.exe」.
VC 6 exe 96 DPI
exe のプロパティで「システム(拡張)」としたもの.
VC 6 exe 192 DPI
0.3 mm の線を表示すると「システム(拡張)」としたものの方がきれい.


AP の作り方にもよると思うが,exe のプロパティで「システム(拡張)」としたものが一番良さそう.
「アプリケーション」にしてしまうと?,他のモニタに移動した時に大きさなどがうまくない.

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

DPI_AWARENESS_CONTEXT

DPI_AWARENESS_CONTEXT を使おうとして,値をダンプしてみたが…

	#ifdef	_DPI_AWARENESS_CONTEXTS_
	{
		std::terr  <<  _T("DPI_AWARENESS_CONTEXT                     \t")  <<  ((  (DPI_AWARENESS_CONTEXT)+0)                 ) << std::endl ;
		std::terr  <<  _T("DPI_AWARENESS_CONTEXT_UNAWARE             \t")  <<      (DPI_AWARENESS_CONTEXT_UNAWARE             ) << std::endl ;
		std::terr  <<  _T("DPI_AWARENESS_CONTEXT_SYSTEM_AWARE        \t")  <<      (DPI_AWARENESS_CONTEXT_SYSTEM_AWARE        ) << std::endl ;
		std::terr  <<  _T("DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE   \t")  <<      (DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE   ) << std::endl ;
		std::terr  <<  _T("DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2\t")  <<      (DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2) << std::endl ;
		std::terr  <<  _T("DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED   \t")  <<      (DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED   ) << std::endl ;
		}
	{
		DPI_AWARENESS_CONTEXT	dac = ::GetWindowDpiAwarenessContext(hwnd) ;
		std::terr  <<  _T("::GetWindowDpiAwarenessContext(hwnd)      \t")  <<  dac << std::endl ;
		std::terr  <<  std::endl ;
		}
	{
		std::terr  <<  _T("DPI_AWARENESS_INVALID                     \t")  <<       DPI_AWARENESS_INVALID                       << std::endl ;
		std::terr  <<  _T("DPI_AWARENESS_UNAWARE                     \t")  <<       DPI_AWARENESS_UNAWARE                       << std::endl ;
		std::terr  <<  _T("DPI_AWARENESS_SYSTEM_AWARE                \t")  <<       DPI_AWARENESS_SYSTEM_AWARE                  << std::endl ;
		std::terr  <<  _T("DPI_AWARENESS_PER_MONITOR_AWARE           \t")  <<       DPI_AWARENESS_PER_MONITOR_AWARE             << std::endl ;
		}
	{
		DPI_AWARENESS_CONTEXT	dac = ::GetWindowDpiAwarenessContext(hwnd) ;
		DPI_AWARENESS           da  = ::GetAwarenessFromDpiAwarenessContext(dac) ;
		std::terr  <<  _T("::GetAwarenessFromDpiAwarenessContext()   \t")  <<  da << std::endl ;
		std::terr  <<  std::endl ;
		}
	{
		if (::IsValidDpiAwarenessContext(DPI_AWARENESS_CONTEXT_UNAWARE             ))       {	std::terr  <<  _T("DPI_AWARENESS_CONTEXT_UNAWARE             \t") << std::endl ;	}
		if (::IsValidDpiAwarenessContext(DPI_AWARENESS_CONTEXT_SYSTEM_AWARE        ))       {	std::terr  <<  _T("DPI_AWARENESS_CONTEXT_SYSTEM_AWARE        \t") << std::endl ;	}
		if (::IsValidDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE   ))       {	std::terr  <<  _T("DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE   \t") << std::endl ;	}
		if (::IsValidDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2))       {	std::terr  <<  _T("DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2\t") << std::endl ;	}
		if (::IsValidDpiAwarenessContext(DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED   ))       {	std::terr  <<  _T("DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED   \t") << std::endl ;	}
		std::terr  <<  std::endl ;
		}
	{
		DPI_AWARENESS_CONTEXT	dac = ::GetWindowDpiAwarenessContext(hwnd) ;
		if (::AreDpiAwarenessContextsEqual(dac,DPI_AWARENESS_CONTEXT_UNAWARE             )) {	std::terr  <<  _T("DPI_AWARENESS_CONTEXT_UNAWARE             \t") << std::endl ;	}
		if (::AreDpiAwarenessContextsEqual(dac,DPI_AWARENESS_CONTEXT_SYSTEM_AWARE        )) {	std::terr  <<  _T("DPI_AWARENESS_CONTEXT_SYSTEM_AWARE        \t") << std::endl ;	}
		if (::AreDpiAwarenessContextsEqual(dac,DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE   )) {	std::terr  <<  _T("DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE   \t") << std::endl ;	}
		if (::AreDpiAwarenessContextsEqual(dac,DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2)) {	std::terr  <<  _T("DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2\t") << std::endl ;	}
		if (::AreDpiAwarenessContextsEqual(dac,DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED   )) {	std::terr  <<  _T("DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED   \t") << std::endl ;	}
		std::terr  <<  std::endl ;
		}
	#endif

DPI_AWARENESS
WinNT.h で次の様に定義されているがよくわからない.
#define DECLARE_HANDLE(name) struct name##__; typedef struct name##__ *name

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

::GetDpiForWindow

高 DPI 関連でいろいろと調べてみると ::GetDpiForWindow を使う必要がありそう.
ただ使えるのが Win10 1607 以降みたいで,その辺りをどうしたものか?


次の様に呼出せば 指定した hwnd の値が取れることは確認

	#if	(_MSC_VER >= 1900)
	{
		UINT	dpi = ::GetDpiForWindow(hwnd) ;
		std::terr << dpi << std::endl ;
		}
	#endif

ただ,旧 Windows では存在しないため実行時エラーになる.
そのため ::GetProcAddress利用した方法に

//	UINT	GetDpiForWindow ( [in] HWND hwnd ) ;
typedef	UINT	(WINAPI* P_GDFW)(HWND) ;

UINT	GetDPI	(HWND hwnd)
{
	UINT	dpi = 96/2 ;
	HMODULE	user32 = ::GetModuleHandle(TEXT("user32.dll")) ;
	P_GDFW	p_GetDpiForWindow = (P_GDFW)::GetProcAddress(user32,"GetDpiForWindow") ;
	if (p_GetDpiForWindow != NULL) {
		dpi = p_GetDpiForWindow(hwnd) ;
		}
	else {
		HDC	hdc = ::GetDC(hwnd) ;
		dpi = ::GetDeviceCaps(hdc,LOGPIXELSX) ;
		::ReleaseDC(hwnd,hdc) ;
		}
	return	dpi ;
	}

Win11 で「拡大/縮小」の値を変更したもの.
作成した ::GetDPI を利用した VC6  exe


解像度と DPI の関係が,まだうまく理解できていない.
::GetDpiForWindow は,指定した hwnd の DPI が取得できている.
::GetDeviceCaps では,プライマリの情報が取れる.
「非対応」の場合はスケーリングされた値,「モニターごと」の場合は 100% での値?

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

FBX SDK 2020.3.2

FBX SDK が更新されていた.
https://help.autodesk.com/view/FBX/2020/ENU/?guid=FBX_Developer_Help_welcome_to_the_fbx_sdk_what_new_fbx_sdk_2020_html
今は区切りが良くないので,ダウンロードまで.
FBX SDK 2020.3.2


2023/02/14
追加のインクルードとライブラリを変更.
C:\Program Files\Autodesk\FBX\FBX SDK\2020.3.2\include;%(AdditionalIncludeDirectories)
C:\Program Files\Autodesk\FBX\FBX SDK\2020.3.2\lib\vs2019\x86\$(Configuration);%(AdditionalLibraryDirectories)
C:\Program Files\Autodesk\FBX\FBX SDK\2020.3.2\lib\vs2019\x64\$(Configuration);%(AdditionalLibraryDirectories)
C:\Program Files\Autodesk\FBX\FBX SDK\2020.3.2\include;%(AdditionalIncludeDirectories)

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

buf = string ( buf.c_str () )

先日の共通のコードでのバグ.

tstring	ask_cli	(LPCTSTR msg=_T(""))
{
	tstring	cli ;
	while(true)	{
		tstring	buf ;
		buf.resize(1000) ;
		std::terr << msg ;
		std::tin.getline(&buf[0],std::streamsize(buf.size())) ;
	//	buf = ::QuotM_Del_All(buf.c_str()) ;
		if      (buf == _T("q"))	{	break ;		}
		else if (buf == _T("Q"))	{	break ;		}
		if (buf.empty())         	{	continue ;	}
		cli = buf.c_str() ;
		break ;
		}
	return	cli ;
	}

ループを抜けるために “q” や “Q” と比較している部分が機能しない(break しない).
原因は “q\0\0\0…” と “q\0” を比べているため.
そのため,比較する前に次の様にするとうまく機能する.

{
	tstring	tmp = buf.c_str() ;
	buf = tmp ;
	}

MFC であれば CString::ReleaseBuffer(-1) が使えるが…
buf = tstring(buf.c_str()) とすることで対応.
buf = string ( buf.c_str() )


CString , std::string , …

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

::GetDeviceCaps(dc,HORZRES)

先日のコード を利用して,Windows API の動作のテスト.


#include	<clocale>
#include	<iostream>

#include	"_tdefine.hxx"
#include	"cmd_line.hxx"
#include	"ask_cli.hxx"
//#include	"ask_path.hxx"

#include	<Windows.h>

bool	test	(c_tstring& str)
{
//	std::terr << str << std::endl ;
	HDC	dc = ::GetDC(NULL) ;
	if (dc != NULL) {
		int	hres = ::GetDeviceCaps(dc,HORZRES) ;
		int	vres = ::GetDeviceCaps(dc,VERTRES) ;
		std::terr
			<< _T("HORZRES=") << hres << _T("\t")
			<< _T("VERTRES=") << vres << _T("\t")
			<< std::endl ;
		}
	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 ;
	}

GetDeviceCaps HORZRES VERTRES


::GetDpiForWindow を追加して FHD と 4K 環境で実行.

bool	test	(c_tstring& str)
{
	HWND	hwnd = ::GetConsoleHwnd() ;
	{
		HDC	dc = ::GetDC(hwnd) ;
		if (dc != NULL) {
			int	hres = ::GetDeviceCaps(dc,HORZRES) ;
			int	vres = ::GetDeviceCaps(dc,VERTRES) ;
			std::terr
				<< _T("HORZRES=") << hres << _T("\t")
				<< _T("VERTRES=") << vres << _T("\t")
				<< std::endl ;
			}
		}
//	#ifdef	DPI_AWARENESS_UNAWARE
	{
		HWND	hwnd = ::GetConsoleHwnd() ;
		UINT	dpi = ::GetDpiForWindow(hwnd) ;
		std::terr << dpi << std::endl ;
		}
//	#endif
	return	true ;
	}

GetDpiForWindow

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

コンソール AP のための最初のコード

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 にある.
コンソール AP のための最初のコード
上のコードを test.cpp などとして保存し,同じ所に zip を展開.
g++ test.cpp などでコンパイル可能.


これらを使用したコード.
https://dev.mish.work/wordpress/?s=reg_argv

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

Win11 22H2

昨日 Win11 環境に VS 2005 から 2022 をインストール
その後,幾つかのコードをビルドして動作を確認.


仮想環境の Win11 22H2 で,KB5019509 の更新があった.
幾つか試したいことができたので,ホストの Win11 も 22H2 にしたくなった.


次の所から入って 22H2 をインストール.
https://www.microsoft.com/ja-jp/software-download/windows11/
1 時間程度かかった.


先日インストールした VC 6 を起動してみると…
うまく起動する.ビルドも問題なさそう.仮想マシンで動作していたのは 22H2 だったからか?
ステップ実行できない現象はあるが,何とか使える.
Win11 22H2 での VC 6


2022/10/23
ステップ実行した場合のメッセージが,仮想マシンと異なる.
Win11 22H2 VC6 ステップ実行後のメッセージ
仮想マシンは
—————————
Microsoft Visual C++
—————————
ハンドルされていない例外 は i3DV.exe (OLE32.DLL) にあります: 0xC0000005: Access Violation。
—————————
OK
—————————
ホストは
—————————
Microsoft Visual C++
—————————
OLE リモート呼び出しデバッグには管理者権限が必要です: この機能は使用できません。.
—————————
OK
—————————
Win10 VC6 OLE」で検索すると,次の所が見つかった.
Windows10でVC6を使いたい
どうも「ツール」-「オプション」-「デバッグ」の「OLE RPC デバッグ」のチェックを外す必要があるらしい.
VC6 「ツール」-「オプション」-「デバッグ」-「OLE RPC デバッグ」
チェックを外す操作は,一度「ジャスト イン タイム デバッグ」にチェックを入れてから操作する必要がある.


Win11でVC++6.0アプリは動作するか?

Is this 投稿 useful? Useful Useless 1 of 1 people say this 投稿 is useful.

RC4005: ‘IDR_MANIFEST’ : redefinition

VC6 から順に更新してきたプロジェクトをビルドしていると,warning RC4005: ‘IDR_MANIFEST’ : redefinition .

...
6>------ ビルド開始: プロジェクト:ClipView, 構成:Debug Win32 ------
6>C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\atlmfc\include\afxres.h(32): warning RC4005: 'IDR_MANIFEST' : redefinition
6>
6>  Clip140.vcxproj -> c:\Temp\MICSTool\ClipView\Debug.140\ClipView.exe
6>  Clip140.vcxproj -> c:\Temp\MICSTool\ClipView\Debug.140\ClipView.pdb (Full PDB)
========== ビルド: 6 正常終了、0 失敗、16 更新不要、0 スキップ ==========

resource.h を見ると,確かに IDR_MANIFEST が定義されている.
RC4005 IDR_MANIFEST redefinition
どのタイミングで追加したのかは覚えてないが,resource.h での定義は不要と思われるので削除.

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

Win11 に VS 6 のインストール

先日,Win11 環境に VS6 をインストールした.
手順は Win10 の時と同様 で,DB 関係が入らない様に
VB6 は起動した.
Win11 環境で VB6
が,VC6 は起動できない


昨日,Win10 上の仮想マシンの Win11 に VS6 と SP6 をインストール.
この時 VC 6 は起動可能で,ビルド,デバッグなども動作した.


今日,それを確認すると,デバッグができなくなっている.
全くできないわけではないが,ブレークするとその後がうまくない.
仮想マシン  Win11 の VC6 でデバッグ
何かが更新されて動作しなくなったのか?


Win11 上の仮想マシンとしての Win11 も,起動はできるがデバッグがうまくない.
Win10 の時もそうだったが,何かとの相性? … Win11 21H2 だったため.


2022/10/18
以前使っていた WinXP の VHD があったので,それを Win11 上の仮想マシンとして追加.
最近使ってなかったので,いろいろと問題が…
SMB1 や mklink
なかなかいい運用が見つからない.

VC++6


2022/10/23
22H2 に上げて うまく動作する様になった.


2023/10/30
VC 6 は,Win 10 ,11 で特に困ることはなく利用できている.
たまに使用する機能でうまくないのは「コンポーネントギャラリ」くらい?
Win11 はシステムドライブが SSD のため,$(OutDir) は「シンボリック リンク」にしている.

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

Win11 に入っている MFC*.DLL

先日手に入った Win11 には,予め幾つかの AP が入っていた.
その中には,MFC140u.dll などが入っていたので,改めて新規インストールした環境で調べてみた.
Win11 Pro
Win11 Pro に入っている MFC*.DLL
Win11 Ent
Win11 Ent に入っている MFC*.DLL
やはり MFC40 と MFC42 みたい.


https://jml.mish.work/index.php/cpp/ref-vcredist-xxx-exe.html

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

Win11 VHD

新しく手に入った Win11 を VHD としてバックアップ.
Disk2vhd.exe で VHD に.
zip をダウンロードして解凍すると 3 つの exe になっている.x86,x64,arm で分かれた?
Disk2vhd v2.02 zip
使用する exe は disk2vhd64.exe .
Disk2vhd WIn11 C SYSTEM Recovery
ViritualBox 6.1.38 を Win11 環境にインストール.
先ず,以前とっておいた Win7 vhd 6.5 GB を起動させてみると,
VirtualBox STOP: 0x0000007B
これは,以前書いていて,今回追記した.
https://dev.mish.work/wordpress/2019/05/01/virtualbox-win7-vhd-0x0000007b/


バックアップした VHD で起動.
特に設定を変更していなかったので,起動にはかなりの時間(10 分程度)がかかった.
仮想マシンの Win11 を起動して VirtualBox Guest Additions  をインストール


今度は,仮想マシンに Win11 の iso を利用して OS のインストールから.
起動するとうまく動作しない.
Win11 iso を利用したインストールでうまくない
もう一度.次の表示が出ている時に何かのキーを押すと iso の読込みが始まる.
Press any key to boot from CD or DVD…
Win11 のインストールの開始
が,「この PC では Windows 11 を実行できません」.
この PC では Windows 11 を実行できません
戻って「コンピューターを修復する」を選択.
「コンピューターを修復する」
「トラブルシューティング」-「コマンドプロンプト」.
\HKEY_LOCAL_MACHINE\SYSTEM\Setup\LabConfig を作成して次のものを追加しなければならないらしい.
BypassTPMCheck と BypassSecureBootCheck で,値は DWORD 1 .
\HKEY_LOCAL_MACHINE\SYSTEM\Setup\LabConfig BypassTPMCheck BypassSecureBootCheck
レジストリエディタを終了して,コマンドプロンプトで setup.exe .
あとはいつも通り.


2022/10/06
「この PC では Windows 11 を実行できません」となった時の一般的に書かれている方法.
「Shift」+「F10」でコマンドプロンプトが表示される.
RegEdit を入力.
BypassTPMCheck と BypassSecureBootCheck の追加.
Win11 Shift+F10 Bypass...Check
レジストリエディタや「この PC では Windows 11 を実行できません」を閉じる.
「本当に終了しますか?」を「はい」で閉じる.
「今すぐインストール」の画面に戻り「今すぐインストール」で続ける.


これらのことをやっていて,ひょっとして今までメインで使用していた Win10 環境でも動くのでは?
CPU が i5-6400 で少し古いため動作対象外となっている.
Win10 の VirtualBox 上で Win11

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.