ホーム » 検索結果: VS 6 (ページ 3)

検索結果: VS 6

2024年11月
 12
3456789
10111213141516
17181920212223
24252627282930

カテゴリー

アーカイブ

ブログ統計情報

  • 99,452 アクセス


GetGlyphOutline の続き

TTPOLYCURVE は,ポリラインはそのまま扱えるが,ベジェ曲線の場合はそれなりの処理が必要.
TT_PRIM_LINE , TT_PRIM_QSPLINE , TT_PRIM_CSPLINE
それで ChatGPT に Bezier と問合わせると,
ChatGPT  Bezier
2次ベジェ曲線
B(t) = (1-t)^2 * P0 + 2t(1-t) * P1 + t^2 * P2
3次ベジェ曲線
B(t) = (1-t)^3 * P0 + 3t(1-t)^2 * P1 + 3t^2(1-t) * P2 + t^3 * P3


w0 から w3 を求める部分の挿入位置が違っていたが,ほぼそのままのコード.
ベジェ曲線の Python のコード
C++ でのコードは次の様なもの.5 年位前に作成した 3 次ベジェ曲線 に合わせたコード.

Vd3A	bezier	(const Vd3& q0,const Vd3& q1,const Vd3& q2,const long div_c)
{
	Vd3A	vd3a ;
	for (long index=0 ; index<=div_c ; index++) {
		double	t  = 1./div_c*index ;
		double	b0 = (1.-t)*(1.-t) ;			//	(1-t)^2
		double	b1 = 2.*t  *(1.-t) ;			//	2 * (1-t) * t
		double	b2 = t*t ;         			//	t^2
		double	px = (b0*q0.x) + (b1*q1.x) + (b2*q2.x) ;
		double	py = (b0*q0.y) + (b1*q1.y) + (b2*q2.y) ;
		double	pz = (b0*q0.z) + (b1*q1.z) + (b2*q2.z) ;
		vd3a.push_back(Vd3(px,py,pz)) ;
		}
	return	vd3a ;
	}

2023/03/14
最初,1 つの TT_PRIM_QSPLINE が次の様になっている場合の始点,終点と制御点の与え方がわからなかった.
(8,0) (5,0) (1,4) (1,8)    …   ‘O’ の左下,見やすい様に整数にしている.
::bezier を 2 回呼出す.それぞれの値は次の様に指定する.
(8,0) (5,0) (3,2)
(3,2) (1,4) (1,8)
(3,2) は (5,0) と (1,4) の中点.
TT_PRIM_QSPLINE  O
まだうまくない部分はあるが,何とか.
TT_PRIM_QSPLINE  月

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

Synology File Station

Synlogy NAS で Web サーバを公開している人は少ないのかもしれないが… 


保有している多くの NAS で,ブラウザやスマートフォンなどからファイルを操作できる様になっている.
Synology NAS の場合は,File Station と DS file
Synology NAS  File Station
ほとんどの場合,PC から「エクスプローラ」で直接操作している.
たまに,スマートフォンの DS file で見る程度.


いろいろと操作していて,//192.168.x.xxx/(File Station のエイリアス)/ で開けてしまうことに気づいた.
以前は //192.168.x.xxx:5000/ の様な,DSM にログインする時と同じ方法だったと思う.
Synology NAS 「ログインポータル」-「アプリケーション」
外からは操作することはないので,ファイアウォールなどで…と思うが,うまい設定がわからない.


パスワードなどが漏れなければログインされることはないはずだが,どうしたものか?
エイリアスを外して様子見.

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

VirtualBox 7.0 に更新

Win10 と Win11 の ViurtalBox を 6.1.40 から 7.0.4 に更新した.
4K 環境になってから,いろいろと表示でうまくない部分があった.


Win10 環境は,Win11 の仮想マシンを除いては問題なさそう.
Win10  VirtualBox 7.0.4
一度 Win11 仮想マシンを「除去」して,作成し直してみたが,うまく動作しない.
起動中の「お待ちください」の表示で止まってしまう.
仮想マシンの「設定」-「ディスプレイ」の「3Dアクセラレーションを有効化」にチェックして止まらなくなった.
「設定」-「ディスプレイ」-「スクリーン」-「3Dアクセラレーションを有効化」
どこかに設定があるものと思うが,OpenGL での表示がうまくされない.
VirtualBox 7  OpenGL 表示ができない?


Win11 環境は,LAN 関係のエラーでうまく起動しない.
6.1.40 に戻したがうまく起動しなくなってしまった.
Win11 VirtualBox 7  VERR_SUPDRV_COMPONENT_NOT_FOUND
「ネットワークアダプターを有効化」のチェックを外せば起動するが,これだとあまり使い物にならない.
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}
Failed to open/create the internal network 'HostInterfaceNetworking-VirtualBox Host-Only Ethernet Adapter' (VERR_SUPDRV_COMPONENT_NOT_FOUND).


アンインストールやデバイスの削除を行って,再度インストールしたら少し動作する様になった.
デバイスマネージャーで VirtualBox Host-Only Ethernet Adapter がうまくなかったので,そこが原因だったか?
まだうまく動作しない仮想マシンもあるが,あとは個別の設定なので何とかなるかな?


2023/06/05
Win11 環境で 7.0.8 にあげて,LAN 関係で同じ様な現象.
PC を再起動して,うまく動作する様になった.

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

.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 スキップ ==========

fatal error C1190: マネージ ターゲット コードには '/clr' が必要です。
プロジェクトの設定で「/clr」に.

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 の場所を指定して通る様にはなったが,これで良いかがわからない.
fatal error C1107: アセンブリ 'System.IO.Compression.FileSystem.dll' がみつかりませんでした:


ほとんど何も入っていない環境で実行すると,

---------------------------
T_ZIP_C.exe - システム エラー
---------------------------
MSVCR110.dll が見つからないため、コードの実行を続行できません。プログラムを再インストールすると、この問題が解決する可能性があります。 
---------------------------
OK   
---------------------------

MSVCR110.dll が見つからないため、コードの実行を続行できません。
VC 2013 や 2015 でビルドしたものも試してみたが,この環境では実行できなかった.
対応するものを入れる必要があるのか?
https://jml.mish.work/index.php/cpp/ref-vcredist-xxx-exe.html


zip_CLI.hxx


2024/07/05
VC のバージョン(実際は .NET のバージョン?)により,微妙に zip の内容が異なるみたい.
3MF データが開けない?

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

.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 スキップ ==========

ZipFile のビルドで error CS0103
そこにも書かれているが System.IO.Compression.FileSystem を追加する必要がある.
「 System.IO.Compression.FileSystem 」の追加
…\bin\…\start\ に,幾つかのファイルをコビー.
exe を実行すると,result.zip と …\extract\ 以下にファイルが解凍される.
再度実行する場合は result.zip と extract\ を削除する必要がある.
'result.zip' は既に存在します


ディレクトリ区切りの ‘\’ を ‘/’ に変更する必要があるが,Ubuntu でも同様に実行可能.
Ubuntu 環境で ZipFile クラスのサンプルを実行

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

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.

「.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 サーバ

次の様なものをブラウザで表示するために…
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.

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.

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.

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.

VC 14 以降での stat.c の場所

VC 14 以降,<sys/stat.h> 関係が大きく変更されている?
CFileStatus でアサート


今回 stat 関数内をデバッグしようとしていて,ソースの場所がすぐにわからなかった.

#ifdef		_MSC_VER
#define		s_stat		struct	_stati64
#define		TSTAT		_tstati64
#else
#define		s_stat		struct	stat
#define		TSTAT		stat
#endif

VC 12 以前は,(VS)\VC\crt\src\ 以下に存在する.


VC で,#include <sys/stat.h> としている所を「右クリック」-「ドキュメント<sys/stat.h>を開く」.
その位置を幾つか上に行って,Include の並びに Source があり,その対応する所に存在する.
VC 14 以降の C ランタイムのソースの場所
VC 2015 以降のどれかで対応がつくと,それ以外でも対応したもの(10.0.?????.0)が開かれる?


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

::GetFileVersionInfo

以前から使用している FileVer.?xx が MFC に依存しているので,その書き直し.


Win8 の頃だったと思うが,OS のバージョンの取得方法が面倒になった.
システム バージョンの取得
オペレーティング システムのバージョン
欲しいのは動作 OS のバージョン文字列なので WinVer.exe などから取得する様にしていた.


で,書き換えようと思って調べていると…
exe のプロパティで表示されるファイルバージョンと異なることに気付いた.
where.exe のバージョン情報
::GetFileVersionInfo で取得すると次の文字列が返ってくる.
10.0.19041.1826 (WinBuild.160101.0800)


次の様なコードを書いて ::GetFileVersionInfo で返されるものをダンプ.

{
	DWORD	VerHandle   = 0 ;
	DWORD	VerInfoSize = 0 ;
	v_char	VerData ;
	VerInfoSize = ::GetFileVersionInfoSize(LPTSTR(file.c_str()),&VerHandle) ;
	VerData.resize(VerInfoSize*2) ;
	if (::GetFileVersionInfo(LPTSTR(file.c_str()),VerHandle,VerInfoSize,&VerData[0])) {
		tstring	tmp_path = ::Get_i_Tools_tmp_date() ;
		tstring	tmp_name = ::Path_AddLastSP(tmp_path) + ::Path_GetName(file) + _T(".dmp") ;
		::v_c_Save(tmp_name.c_str(),VerData) ;
		}
	}

::GetFileVersionInfo で返されるデータのダンプ


ファイルバージョンの取得.

{
	/*
		VS_VERSION_INFO VERSIONINFO
		 FILEVERSION 1,53,2022,1
		 PRODUCTVERSION 1,53,2022,1
		 FILEFLAGSMASK 0x3fL
		#ifdef _DEBUG
		 FILEFLAGS 0x1L
		#else
		 FILEFLAGS 0x0L
		#endif
		 FILEOS 0x4L
		 FILETYPE 0x1L
		 FILESUBTYPE 0x0L
		BEGIN
		    BLOCK "StringFileInfo"
		    BEGIN
		        BLOCK "041104b0"
		        BEGIN
		            VALUE "Comments", "\0"
		            VALUE "CompanyName", "\0"
		            VALUE "FileDescription", "3D Viewer\0"
		            VALUE "FileVersion", "1, 53, 2022, 1\0"
		            VALUE "InternalName", "i3DV\0"
		            VALUE "LegalCopyright", "Copyright (C) 2013-2022  I. Nakagawa\0"
		            VALUE "LegalTrademarks", "\0"
		            VALUE "OriginalFilename", "i3DV.exe\0"
		            VALUE "PrivateBuild", "\0"
		            VALUE "ProductName", "i_Tools\0"
		            VALUE "ProductVersion", "1, 53, 2022, 1\0"
		            VALUE "SpecialBuild", "\0"
		        END
		    END
		    BLOCK "VarFileInfo"
		    BEGIN
		        VALUE "Translation", 0x411, 1200
		    END
		END
	*/
	tstring	StringFileInfo ;
	{
		struct	LANGANDCODEPAGE	{
			WORD	wLanguage ;		//	0x411
			WORD	wCodePage ;		//	1200	0x4b0
			}	*lpTranslate	= NULL ;
		UINT	lenT = 0 ;
		if (::VerQueryValue(&VerData[0],_T("\\VarFileInfo\\Translation"),(void**)&lpTranslate,&lenT)) {
			tstring	lang_cp_str =	::u32to0t(lpTranslate->wLanguage,16,4) +
			                     	::u32to0t(lpTranslate->wCodePage,16,4) ;		//	"041104b0"
			StringFileInfo = _T("\\StringFileInfo\\") + lang_cp_str + _T("\\") ;
			}
		}
	{
		UINT	lenFV = 0 ;
		TCHAR*	lpFV  = NULL ;
		tstring	name  = _T("FileVersion") ;
		if (::VerQueryValue(&VerData[0],LPTSTR((StringFileInfo+name).c_str()),(void**)&lpFV,&lenFV)) {
			std::terr << lpFV	<<	std::endl ;
			}
		}
	}

FVersion.hxx

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

FBX SDK 2020.3.1

久しぶりに FBX SDK のページを見たら 2020.3.1 があったのでダウンロード.
FBX SDK 2020.3.1


2022/05/02
追加のインクルードとライブラリを変更.
C:\Program Files\Autodesk\FBX\FBX SDK\2020.3.1\include;%(AdditionalIncludeDirectories)
C:\Program Files\Autodesk\FBX\FBX SDK\2020.3.1\lib\vs2019\x86\$(Configuration);%(AdditionalLibraryDirectories)
https://jml.mish.work/index.php/cpp/fbx-sdk-setting.html


VC 2017 でビルドすると PDB が足りない?ため warning LNK4099 になる.
LibXml2-MD.lib(buf.obj) : warning LNK4099: PDB ‘libxml2.pdb’ が ‘LibXml2-MD.lib(buf.obj)’ で、または ‘c:\Temp\MICSTool\FBXtoM\Release.141\x64\libxml2.pdb’ に見つかりません。デバッグ情報がないものとして、オブジェクトにリンクします。
Zlib-MD.lib(adler32.obj) : warning LNK4099: PDB ‘zlib.pdb’ が ‘Zlib-MD.lib(adler32.obj)’ で、または ‘c:\Temp\MICSTool\FBXtoM\Release.141\x64\zlib.pdb’ に見つかりません。デバッグ情報がないものとして、オブジェクトにリンクします。
インストールされるものを見ると VC 2015 も同様.
VC 2019 ならば OK.

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

C4995: ‘gets’: 名前が避けられた …

.lnk 関係の ResolveIt をやっていて strsafe.h を使用すると…

1>------ ビルド開始: プロジェクト: T_path_l, 構成: Debug Win32 ------
1>コンパイルしています...
1>T_paht_l.cpp
1>c:\program files (x86)\microsoft visual studio 8\vc\include\cstdio(33) : warning C4995: 'gets': 名前が避けられた #pragma として記述されています。
1>c:\program files (x86)\microsoft visual studio 8\vc\include\cstdio(37) : warning C4995: 'sprintf': 名前が避けられた #pragma として記述されています。
1>c:\program files (x86)\microsoft visual studio 8\vc\include\cstdio(40) : warning C4995: 'vsprintf': 名前が避けられた #pragma として記述されています。
1>c:\program files (x86)\microsoft visual studio 8\vc\include\cstring(20) : warning C4995: 'strcat': 名前が避けられた #pragma として記述されています。
1>c:\program files (x86)\microsoft visual studio 8\vc\include\cstring(21) : warning C4995: 'strcpy': 名前が避けられた #pragma として記述されています。
1>c:\program files (x86)\microsoft visual studio 8\vc\include\cwchar(34) : warning C4995: 'swprintf': 名前が避けられた #pragma として記述されています。
1>c:\program files (x86)\microsoft visual studio 8\vc\include\cwchar(35) : warning C4995: 'vswprintf': 名前が避けられた #pragma として記述されています。
1>c:\program files (x86)\microsoft visual studio 8\vc\include\cwchar(37) : warning C4995: 'wcscat': 名前が避けられた #pragma として記述されています。
1>c:\program files (x86)\microsoft visual studio 8\vc\include\cwchar(39) : warning C4995: 'wcscpy': 名前が避けられた #pragma として記述されています。
1>マニフェストをリソースにコンパイルしています...
1>リンクしています...
1>マニフェストを埋め込んでいます...
1>T_path_l - エラー 0、警告 9
========== ビルド: 1 正常終了、0 失敗、0 更新、0 スキップ ==========

warning C4995: 'gets': 名前が避けられた #pragma として記述されています。
コンパイラの警告 (レベル 3) C4995
ドキュメントにある様に,次を追加して対応.
#pragma warning(disable : 4995)
#pragma	warning(disable : 4995)

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

FBX SDK 2020.2.1 に更新

FBX SDK を 2020.2.1 に更新.
プロジェクト設定の,インクルードとライブラリのディレクトリを変更.
C:\Program Files\Autodesk\FBX\FBX SDK\2020.2.1\include;%(AdditionalIncludeDirectories)
FBX SDK 2020.2.1 include
C:\Program Files\Autodesk\FBX\FBX SDK\2020.2.1\lib\vs2019\x86\$(Configuration);%(AdditionalLibraryDirectories)
FBX SDK 2020.2.1 Lib
特に問題なくビルド完了.動作テストはこれから.


#pragma comment (lib, “LibFbxSDK-MD.lib”) などの設定は次の所に書いている.
https://jml.mish.work/index.php/cpp/fbx-sdk-setting.html

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

VC リリースビルドのデバッグ

先日の VC 6 でのリリースビルドでうまくなかった現象
これをデバッグするための設定.
以前から何度か使っているが,今回コンパイル時の設定部分が何故かすぐにわからなかったのでメモ.
リリースビルドのデバッグ コンパイル設定
同様に,リンクの設定でも「Generate debug info」のチェックが必要.
方法: リリース ビルドをデバッグする

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

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 を定義したことを思い出した.
#define nullptr NULL
VC 2015 以降では定義されない様に変更.
うまくいった.


nullptr は VC10 以降で使えるみたいで _MSC_VER < 1600 に変更.
https://ja.wikipedia.org/wiki/Microsoft_Visual_C++

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

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 となる様にしたもの.
OPENFILENAME_SIZE_VERSION_400


MFC 9 で bVistaStyle を FALSE とすると
CFileDialog bVistaStyle == FALSE
VC 8 exe と同様の,左側がフォルダツリーではない表示のもの.
デフォルトの TRUE だと
CFileDialog bVistaStyle == TRUE
COM を利用したもの?
Common Item Dialog


今度は MFC を使用しない方法.
::GetOpenFileName を使用する方法で OFN_ALLOWMULTISELECT を指定すると実行されなかった.
見た目のエラーにはならない?が,API を呼んで FALSE で抜けてくる.
::CommDlgExtendedError で調べると FNERR_INVALIDFILENAME だった.
存在しないファイル名などを与えるとうまくないみたい.
まだ何か足りないみたいで Win3.x 頃の表示になってしまった.
GetOpenFileName  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] ;
		}

ここまでのものを WinXP 環境で表示すると
GetOpenFileName WinXP


WFDialog.hxx

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