ホーム » 検索結果: VS 6 (ページ 3)
検索結果: VS 6
GetGlyphOutline の続き
TTPOLYCURVE は,ポリラインはそのまま扱えるが,ベジェ曲線の場合はそれなりの処理が必要.
TT_PRIM_LINE , TT_PRIM_QSPLINE , TT_PRIM_CSPLINE
それで 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 を求める部分の挿入位置が違っていたが,ほぼそのままのコード.
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) の中点.
まだうまくない部分はあるが,何とか.
Synology File Station
Synlogy NAS で Web サーバを公開している人は少ないのかもしれないが…
保有している多くの NAS で,ブラウザやスマートフォンなどからファイルを操作できる様になっている.
Synology NAS の場合は,File Station と DS file .
ほとんどの場合,PC から「エクスプローラ」で直接操作している.
たまに,スマートフォンの DS file で見る程度.
いろいろと操作していて,//192.168.x.xxx/(File Station のエイリアス)/ で開けてしまうことに気づいた.
以前は //192.168.x.xxx:5000/ の様な,DSM にログインする時と同じ方法だったと思う.
外からは操作することはないので,ファイアウォールなどで…と思うが,うまい設定がわからない.
VirtualBox 7.0 に更新
Win10 と Win11 の ViurtalBox を 6.1.40 から 7.0.4 に更新した.
4K 環境になってから,いろいろと表示でうまくない部分があった.
Win10 環境は,Win11 の仮想マシンを除いては問題なさそう.
一度 Win11 仮想マシンを「除去」して,作成し直してみたが,うまく動作しない.
起動中の「お待ちください」の表示で止まってしまう.
仮想マシンの「設定」-「ディスプレイ」の「3Dアクセラレーションを有効化」にチェックして止まらなくなった.
どこかに設定があるものと思うが,OpenGL での表示がうまくされない.
Win11 環境は,LAN 関係のエラーでうまく起動しない.
6.1.40 に戻したがうまく起動しなくなってしまった.
「ネットワークアダプターを有効化」のチェックを外せば起動するが,これだとあまり使い物にならない.
ASUSTOR NAS でも同様のエラー になったことがあるので,設定ではないのか?
もう一度 7.0.4 にしてみたが,変わらず.
VM Name: Win10-VS6
Failed to open/create the internal network ‘HostInterfaceNetworking-VirtualBox Host-Only Ethernet Adapter’ (VERR_SUPDRV_COMPONENT_NOT_FOUND).
Failed to attach the network LUN (VERR_SUPDRV_COMPONENT_NOT_FOUND).
Result Code:
E_FAIL (0X80004005)
Component:
ConsoleWrap
Interface:
IConsole {6ac83d89-6ee7-4e33-8ae6-b257b2e81be8}
アンインストールやデバイスの削除を行って,再度インストールしたら少し動作する様になった.
デバイスマネージャーで VirtualBox Host-Only Ethernet Adapter がうまくなかったので,そこが原因だったか?
まだうまく動作しない仮想マシンもあるが,あとは個別の設定なので何とかなるかな?
2023/06/05
Win11 環境で 7.0.8 にあげて,LAN 関係で同じ様な現象.
PC を再起動して,うまく動作する様になった.
.NET ZipFile C++/CLI
ZipFile クラスのサンプル を VC 2012 C++/CLI で.
Win32 コンソール AP としてプロジェクトを作成.
CPP を次の様に変更.
#include <stdio.h>
#include <tchar.h>
// using System;
// using System.IO.Compression;
#using <System.dll>
#using <System.IO.Compression.FileSystem.dll>
// class Program
// {
// static void Main(string[] args)
// {
int _tmain(int argc, _TCHAR* argv[])
{
// string startPath = @"./start";
// string zipPath = @"./result.zip";
// string extractPath = @"./extract";
System::String^ startPath = _T("./start") ;
System::String^ zipPath = _T("./result.zip") ;
System::String^ extractPath = _T("./extract") ;
// ZipFile. CreateFromDirectory(startPath, zipPath);
System::IO::Compression::ZipFile::CreateFromDirectory(startPath, zipPath);
// ZipFile. ExtractToDirectory(zipPath, extractPath);
System::IO::Compression::ZipFile::ExtractToDirectory(zipPath, extractPath);
return 0;
}
// }
// }
そのままビルドすると…
1>------ ビルド開始: プロジェクト: T_ZIP_C, 構成: Debug Win32 ------
1> T_ZIP_C.cpp
1>d:\document\vs\vs\2012\t_clr\t_zip_c\t_zip_c.cpp(6): fatal error C1190: マネージ ターゲット コードには '/clr' が必要です。
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
1>------ ビルド開始: プロジェクト: T_ZIP_C, 構成: Debug Win32 ------
1> T_ZIP_C.cpp
1>T_ZIP_C.cpp(7): fatal error C1107: アセンブリ 'System.IO.Compression.FileSystem.dll' がみつかりませんでした: /AI または LIBPATH 環境変数を使用してアセンブリ検索パスを指定してください。
========== ビルド: 0 正常終了、1 失敗、3 更新不要、0 スキップ ==========
「追加の #using ディレクトリ」に dll の場所を指定して通る様にはなったが,これで良いかがわからない.
ほとんど何も入っていない環境で実行すると,
---------------------------
T_ZIP_C.exe - システム エラー
---------------------------
MSVCR110.dll が見つからないため、コードの実行を続行できません。プログラムを再インストールすると、この問題が解決する可能性があります。
---------------------------
OK
---------------------------
VC 2013 や 2015 でビルドしたものも試してみたが,この環境では実行できなかった.
対応するものを入れる必要があるのか?
https://jml.mish.work/index.php/cpp/ref-vcredist-xxx-exe.html
2024/07/05
VC のバージョン(実際は .NET のバージョン?)により,微妙に zip の内容が異なるみたい.
3MF データが開けない?
.NET ZipFile C#
今まで Windows で zip を扱う部分で Shell を利用 してきた.
その時,存在は知っていたが,手を付けてなかった .NET を利用したものを調べることに…
サンプルは次の所にある.
ZipFile クラス
.NET Framework 4.5 以降なので VS 2012 で C# のプロジェクトを作成.
Program.cs をサンプルの様に変更してビルドすると…
1>------ ビルド開始: プロジェクト: T_ZIP, 構成: Debug Any CPU ------
1>D:\Document\VS\VS\2012\T_CLR\T_ZIP\Program.cs(12,9,12,16): error CS0103: 名前 'ZipFile' は現在のコンテキスト内に存在しません。
1>D:\Document\VS\VS\2012\T_CLR\T_ZIP\Program.cs(14,9,14,16): error CS0103: 名前 'ZipFile' は現在のコンテキスト内に存在しません。
========== ビルド: 0 正常終了、1 失敗、1 更新不要、0 スキップ ==========
そこにも書かれているが System.IO.Compression.FileSystem を追加する必要がある.
…\bin\…\start\ に,幾つかのファイルをコビー.
exe を実行すると,result.zip と …\extract\ 以下にファイルが解凍される.
再度実行する場合は result.zip と extract\ を削除する必要がある.
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) ;
}
「共通言語ランタイム サポート(/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;
}
::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 スキップ ==========
どこかを設定を設定すれば良いのかもしれないが,ちょっとわからない.
「.NET なんとか」
「.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;
}
簡易 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 環境で同様に実行すると,次の様な表示が…
開発環境には VS 2022 などが入っているので Python を使用した方法
…\Test\Web\WebGL\ に html などをコピー.
コマンドプロンプトで …\Test に移動.
py -m http.server
これで 127.0.0.1:8000 でアクセスできる.
終了は「Ctrl」+「C」.
ASUSTOR NAS だと,
python -m http.server
QNAP NAS や Synology NAS でも同様.Raspberry Pi にもあった.
検索すると System.Net.HttpListener.dll と言うのが見つかる.
それを使っていると思われる次の所からコードを拝借.
Windows 標準で Web サーバを起動する
勉強を兼ねて,ちょっとやってみるか.
2023/01/17
https://jml.mish.work/index.php/i-tools/web-svr.html
Win7 ライセンス認証
Win7 のライセンス認証がうまく通らない.「エラー コード 0x80072F8F」になってしまう.
一時的なものか,それともどこかが壊れているのかと思いそのままになっていた環境.
先日,動作確認のために Win7 のクリーンな環境が必要になり,仮想マシンにインストール.
その時も同様のエラーだったので,電話で取得した.
それで,通らなかった環境の電話での手順.
「ライセンス認証の手続きを行う他の方法を表示します」を選択.
「自動電話システムを使用します」を選択.
「日本」を選択.
表示された電話番号にかけて,電話で「インストール ID」を入力.
正しく入力できると「確認 ID」が案内される.
「確認 ID」を入力して「次へ」.
How To Activate Windows 7 by Phone Step-by-Step Guide
Windows の製品ライセンス認証 – オンライン サポートの電話番号
2024/05/23
WinXP CHS をアクティベーションする必要があったので,Win7 の時と同様に実施.
電話をかけると,AI による対応になったみたい.
反応があまり良いとは言えないのでイライラするが,何とか認証できた.
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
今は区切りが良くないので,ダウンロードまで.
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)
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 だったからか?
ステップ実行できない現象はあるが,何とか使える.
2022/10/23
ステップ実行した場合のメッセージが,仮想マシンと異なる.
仮想マシンは
—————————
Microsoft Visual C++
—————————
ハンドルされていない例外 は i3DV.exe (OLE32.DLL) にあります: 0xC0000005: Access Violation。
—————————
OK
—————————
ホストは
—————————
Microsoft Visual C++
—————————
OLE リモート呼び出しデバッグには管理者権限が必要です: この機能は使用できません。.
—————————
OK
—————————
「Win10 VC6 OLE」で検索すると,次の所が見つかった.
Windows10でVC6を使いたい
どうも「ツール」-「オプション」-「デバッグ」の「OLE RPC デバッグ」のチェックを外す必要があるらしい.
チェックを外す操作は,一度「ジャスト イン タイム デバッグ」にチェックを入れてから操作する必要がある.
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 2015 以降のどれかで対応がつくと,それ以外でも対応したもの(10.0.?????.0)が開かれる?
::GetFileVersionInfo
以前から使用している FileVer.?xx が MFC に依存しているので,その書き直し.
Win8 の頃だったと思うが,OS のバージョンの取得方法が面倒になった.
システム バージョンの取得
オペレーティング システムのバージョン
欲しいのは動作 OS のバージョン文字列なので WinVer.exe などから取得する様にしていた.
で,書き換えようと思って調べていると…
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) ;
}
}
ファイルバージョンの取得.
{
/*
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 ;
}
}
}
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.
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 スキップ ==========
コンパイラの警告 (レベル 3) C4995
ドキュメントにある様に,次を追加して対応.
#pragma warning(disable : 4995)
FBX SDK 2020.2.1 に更新
FBX SDK を 2020.2.1 に更新.
プロジェクト設定の,インクルードとライブラリのディレクトリを変更.
C:\Program Files\Autodesk\FBX\FBX SDK\2020.2.1\include;%(AdditionalIncludeDirectories)
C:\Program Files\Autodesk\FBX\FBX SDK\2020.2.1\lib\vs2019\x86\$(Configuration);%(AdditionalLibraryDirectories)
特に問題なくビルド完了.動作テストはこれから.
#pragma comment (lib, “LibFbxSDK-MD.lib”) などの設定は次の所に書いている.
https://jml.mish.work/index.php/cpp/fbx-sdk-setting.html
VC リリースビルドのデバッグ
先日の VC 6 でのリリースビルドでうまくなかった現象 .
これをデバッグするための設定.
以前から何度か使っているが,今回コンパイル時の設定部分が何故かすぐにわからなかったのでメモ.
同様に,リンクの設定でも「Generate debug info」のチェックが必要.
方法: リリース ビルドをデバッグする
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++
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] ;
}