ホーム » Windows (ページ 2)

Windows」カテゴリーアーカイブ

2024年9月
1234567
891011121314
15161718192021
22232425262728
2930  

カテゴリー

アーカイブ

ブログ統計情報

  • 92,805 アクセス


AppName.ini

何年か前に作成したツールをビルドしていて,ちょっと気になったこと.
exe 名を変更した時,設定値がうまく引き継がれない.
レジストリを使用している時は AFX_IDS_APP_TITLE を追加すれば良いが ini では効果がない.
CWinApp::SetCurrentHandles()    m_pszProfileName


最近書いたコードからは,次の様に m_pszProfileName を変更する様にしている.

BOOL	RI_Set_ProfileName		(void)
{
	CWinApp*	app = AfxGetApp() ;
	if (app == NULL)    	{	return	FALSE ;		}
	CString		nowINI = app->m_pszProfileName ;
	CString		newINI = ::INI_get_module_ini().c_str() ;
	if (nowINI == newINI)	{	return	TRUE ;		}
	free((void*)app->m_pszProfileName) ;
	app->m_pszProfileName = _tcsdup(newINI) ;
	{
		std::tout << _T("org=") << LPCTSTR(nowINI) << std::endl ;
		std::tout << _T("new=") << LPCTSTR(newINI) << std::endl ;
		}
	return	TRUE ;
	}
Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

ダイアログベース コマンドライン

ファイルの関連付けを調べていて,3D データを表示するツールに関連付けるとうまく表示されない.
MFC ダイアログベースのスケルトンでは,コマンドラインの標準的な処理は入っていない.


それで OnInitDialog の最後の方で次の様にした.

{
	CStringArray	readFiles ;
	for (int a_index=1 ; a_index<__argc ; a_index++) {
		CString	av = __targv[a_index] ;
		readFiles.Add(av) ;
		}
	if (readFiles.GetSize() > 0) {
		ReadFiles(readFiles) ;
		}
	}

S_asZ  2024.01


更に,幾つかのツールでうまく開けないものがあった.
InitInstance での初期化手順がうまくなかった.
i3DV  App  InitInstance

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

フォルダの更新日時の設定

以前に作成した mtime を更新するツール
データファイルなどの更新日時を揃えるために作成したもの.
更新日時の設定は CFile::SetStatus で行っている.

	CString		file = UpdateFiles[index] ;
	CFileStatus	fs ;
	CFile::GetStatus(file,fs) ;
	fs.m_mtime = newTime ;
	CFile::SetStatus(file,fs) ;

このツールではフォルダの更新日時は変更できない.


その後 Linux 環境などでも動作する様なコードを作成
utime を使用したもの.
Linux 環境ではフォルダに対してもうまく動作するが,Windows 環境では相変わらず.
DS220  utime
ここまでは,以前調べたもの


2ヶ月ほど前だったと思うが,検索していて次のページを見つけた.
ファイル・フォルダーの更新日時を変更


改めて CFile::SetStatus や _utime の中身を見ると,動作は同じで ::CreateFile と ::SetFileTime を呼出している.
デバッガで追いかけていると ::CreateFile で失敗している.errno は 13 .
::CreateFile を次の様に指定して呼出すと,ファイルの場合は問題ないがフォルダは NG .

HANDLE  hFile = ::CreateFile(file_name,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,     NULL) ;

フォルダの場合 FILE_FLAG_BACKUP_SEMANTICS が指定されていなければならないみたい.

HANDLE  hFile = ::CreateFile(file_name,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_BACKUP_SEMANTICS,NULL) ;

time_t から FILETIME への変換は次の所.
https://learn.microsoft.com/ja-jp/windows/win32/sysinfo/converting-a-time-t-value-to-a-file-time
SetFTime.hxx


2024/08/09
https://itl.mish.work/i_Tools/Doc/blog/vc/UpdateMT.zip

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

.INI に更新されない?

個人的なツールなどでレジストリを汚したくないために .ini を使用している.
今回個人的な ProtectT クラスを書き直してテストしているとうまく動作しない.
該当コードの単体テストではうまく通るが,ツールに組込んで動作させるとうまくいかないことがある.
コードの内容としては,共通の i_Tools.ini と AP.ini に同じ値を更新していて,それを読みだした時に値が異なっていた.


i_Tools.ini は他の AP からも読み書きしている.
タイミングによって,うまく更新できないことがある?
文字の立体化
ProtectT の i_Tools.ini へアクセスするコードを見直して,極力書き込みを減らすようにした.
また,読み込み時,値が意図したものと異なる場合は AP.ini の方を利用する様にした.
これで今回の部分は対応できていると思うが,他の既存部分ではまだ問題がありそう.


次の様なコードで確認すると,やはり書けないことがある様子.

	{
		#define	Sec_test  _T("_test_")
		#define	Ent_test  _T("_test_")
		RI_app	app ;
		RI_env	env ;
		for (long index=0 ; index<500 ; index++) {
			if (index%10 == 0)	{	std::tout << std::endl ;	}
			std::tout << index << _T("\t") ;
			std::tout << app.set(Sec_test,Ent_test,index) ;	std::tout << _T("  ") ;
			std::tout << env.set(Sec_test,Ent_test,index) ;	std::tout << _T("\t") ;
			long	val_a = app.get(Sec_test,Ent_test,-1) ;
			long	val_e = env.get(Sec_test,Ent_test,-2) ;
			if (val_a != val_e) {
				std::tout << std::endl ;
				std::tout << val_a << _T("\t") << val_e << std::endl ;
				::Sleep(1000) ;
				break ;
				}
			::Sleep(10) ;
			}
		std::tout << std::endl ;
		return	true ;
		}

env.set(…) は,内部的に ::WritePrivateProfileString を呼出していて 0 が返っている.
::WritePrivateProfileString


最初現象を簡単には再現できなかったが,エクスプローラのサムネイル表示を行っていると発生しやすい.
また,今回のテスト用 exe が止まってしまうこともあった.開いているエクスプローラをすべて閉じることで解消.
シェルエクステンションのコードの見直しが必要か?


ini への書き込み部分を次の様に変更.

//	return	(     ::WritePrivateProfileString(sec,ent,val,ini)==TRUE) ;
	BOOL	res = ::WritePrivateProfileString(sec,ent,val,ini) ;
	if (!res)	{
		std::terr << _T("::WritePrivateProfileString ")	<< sec << _T(" ") << ent << _T(" ") << ::GetLastError() << std::endl ;
		for (size_t index=0 ; index<10 ; index++) {
			res = ::WritePrivateProfileString(sec,ent,val,ini) ;
			if (res)	{	break ;		}
			::Sleep(10) ;
			}
		}
	return	(res==TRUE) ;

::GetLastError() では 32 ERROR_SHARING_VIOLATION が返ってくる.

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

VERR_UNRESOLVED_ERROR

Win11 上の仮想マシン Mint を起動しようとすると,
VM Name: Mint
Unresolved (unknown) host platform error. (VERR_UNRESOLVED_ERROR).
Result Code:
E_FAIL (0X80004005)
Component:
ConsoleWrap
Interface:
IConsole {6ac83d89-6ee7-4e33-8ae6-b257b2e81be8}
VirtualBox VERR_UNRESOLVED_ERROR
検索しても該当しそうなものがわからない.
多く見つかるのは,Hyper-V などの無効化.


PC を再起動させよう思い,他の仮想マシンを「保存」して,試しに Mint を起動するとうまく起動した.
それで,「保存」した他の仮想マシンを起動しようとすると同様のエラーに.
こうなると,システムリソースの問題と思い,プロセッサ数を減らすが効果はない.
次にメモリ量を減らしてうまく起動した.
先日作成した WS 2019 のメモリ量を 6G から 4G にして運用することにした.
VirtualBox  Mint


Mint 環境でコンパイルできる様に,共通のコードを参照するための mount .
/mnt/_.src を作成して,Fedora 環境にあった .sh をコピー.が,エラーとなる.
以前やった時を見直すと,IP で指定しないとうまくいかないことがあった
.sh を書き換えてうまくいった.
Mint   mount  IP

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

Windows C++ __argc __argv

MFC でコードを書いていて,コマンドライン引数を取りたくなった.
MFC では次の様にすれば取れるが,欲しいのは c の main に渡される argc と argv .
CString cmd_line = AfxGetApp()->m_lpCmdLine ;
検索すると次の所があった.欲しかった情報は __argc と __argv
【 VC++ MFC 】MFC でコマンドライン引数を利用する方法
次の様なコードを書いて動作を確認.

#include	<clocale>
#include	<iostream>
#include	<tchar.h>

#ifdef	_UNICODE
	#define		tin 		wcin
	#define		tout		wcout
	#define		terr		wcerr
	#define		tlog		wclog
#else
	#define		tin 		cin
	#define		tout		cout
	#define		terr		cerr
	#define		tlog		clog
#endif

int	_tmain	(int ,TCHAR* )
{
	_tsetlocale(LC_ALL,_T("")) ;
	{
		std::tout   		<< __argc      	<< std::endl ;
		for (int index=0 ; index<__argc ; index++) {
			std::tout	<< __targv[index]	<< std::endl ;
			}
		}
	return	0 ;
	}

Windwos C コマンドライン引数
_tmain が呼び出される前の mainCRTStartup の ::_setargv で設定されている.
::_setargv

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

LNK2001 _WinMain@16

VC 6 で,_MBCS から _UNICODE に変更すると,次のエラーになることがある.

--------------------Configuration: T_mtx_n - Win32 Release--------------------
Compiling resources...
Compiling...
StdAfx.cpp
Compiling...
T_mtx_n.cpp
T_mtx_nD.cpp
Generating Code...
Linking...
msvcrt.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16
c:\Temp\Test_win\T_mtex\T_mtx_n\Release.060/T_mtx_n.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

T_mtx_n.exe - 2 error(s), 0 warning(s)

「リンク」タブの「エントリーポイント シンボル」に wWinMainCRTStartup を入力する.
VC 6  「リンク」タブ-「エントリーポイント シンボル」  wWinMainCRTStartup

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

WS 2019 ,IIS インストール

AS5202T 上の WS2022 が,最近不安定な気がする.
元々,WSS の代わりと,テスト環境の IIS を 24 時間動かせると思い設定したもの.


Windows Update などのためにデスクトップを表示すると,フリーズしてしまう.
AS5202T 上の WS2022
ログインしない状態では特に問題ない.


今回 IIS(Classic ASP)のテストが必要になり,PC の仮想環境に WS 2019 をインストールすることにした.
使用した iso が 2021/04 にダウンロードしたものだったので,ブラウザの更新などがうまくできない.
Window Update である程度の所まで上げる必要があるのか?
WS 2019  Windows Update


Classic ASP のインストール.手順は WS 2022 と同様.
WS 2019 に Classic ASP のインストール


次のメッセージが表示される場合,ASP の設定が必要.
An error occurred on the server when processing the URL. Please contact the system administrator.
If you are the system administrator please click here to find out more about this error.
Win10 IIS 「ASP」-「デバッグ プロパティ」-「ブラウザへのエラー送信」


今回は,本番の環境で次のエラー.ログを表示するページのデータ量が 4 MB を超えたと思われる.


Response オブジェクト エラー ‘ASP 0251 : 80004005’
応答バッファー処理の制限の超過
/_CMN_/DrawLogAccess.asp, 行 0
ASP ページの拡張が原因で、応答バッファーが構成された制限を超過しました。


対応方法は次の所にある.
IIS で Response.BinaryWrite を使用しているときに HTTP 500 または応答バッファーの制限を超えた場合のエラー
管理者として実行」したコマンドプロンプトから操作する必要があった.
また「ASP」-「動作」-「制限プロパティ」-「応答バッファー処理の制限」でも変更可能.

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

$(WindowsSDK_IncludePath)

VC 2017 以降?,VS の更新により Windows SDK のパスも更新されてしまうことがある?
プロジェクトの設定にもよるみたいだが…
Windows SDK バージョンの指定


対象のプロジェクトがどれを使用しているかは,次のマクロで確認できる.
$(WindowsSDK_IncludePath) ,$(WindowsSDK_LibraryPath_x86) など.
$(WindowsSDK_IncludePath)
C:\Program Files (x86)\Windows Kits\10\


他によく使うのが,Windows.h などを開いて「このアイテムのフォルダーを開く」.
Windows.h  このアイテムのフォルダーを開く

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

C2039 , C3861 , C2665

個人的なメモです.
VC 6 プロジェクトを VC 7 以降にあげた時のエラー.

1>------ ビルド開始: プロジェクト: PLtoB, 構成: Debug Win32 ------
1>コンパイルしています...
1>PLtoBDlg.cpp
1> ...
1>t:\develop\_.src\__iwao\htmo_th.hxx(70) : error C2039: 'ToImage' : '`global namespace'' のメンバではありません。
1>t:\develop\_.src\__iwao\htmo_th.hxx(70) : error C3861: 'ToImage': 識別子が見つかりませんでした
1>t:\develop\_.src\__iwao\htmo_th.hxx(155) : error C2665: 'ToDIB' : 3 オーバーロードのどれも、すべての引数の型を変換できませんでした
1>        t:\develop\_.src\__win\i_dib_fn.hxx(188): 'i_DIB ToDIB(const HBITMAP)' の可能性があります。
1>        t:\develop\_.src\_afxw\i_dib_x.hxx(86): または 'i_DIB ToDIB(const MemoryDC &)'
1>        引数リスト '(Image)' を一致させようとしているとき
1> ...
1>PLtoB - エラー 3、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ==========

Imgae.hxx を XxxDlg.h に追加.
次の場合は,MemoryDC.hxx を追加.

1>------ ビルド開始: プロジェクト: PLtoB, 構成: Debug Win32 ------
1>コンパイルしています...
1>PLtoBDlg.cpp
1> ...
1>t:\develop\_.src\__iwao\htmo_th.hxx(35) : error C2665: 'ToDIB' : 3 オーバーロードのどれも、すべての引数の型を変換できませんでした
1>        t:\develop\_.src\__win\i_dib_fn.hxx(188): 'i_DIB ToDIB(const HBITMAP)' の可能性があります。
1>        t:\develop\_.src\_afxw\i_dib_x.hxx(56): または 'i_DIB ToDIB(const Image &)'
1>        引数リスト '(MemoryDC)' を一致させようとしているとき
1> ...
1>PLtoB - エラー 1、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ==========

文字の立体化


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

@MS PGothic の高さ方向の間隔

以前から気になっていたことだが,文字列を縦書きにした時重なってしまうことがある.
「@MS Pゴシック」での () () 高さ指定なし
文字ごとに ::GetGlyphOutline を呼出して,位置をずらしている( += gm.gmCellIncX ).


gmptGlyphOrigin を使えばよいのかもしれないが,テストした限りではうまくできなかった.
更にいろいろと試していると,LOGFONT の文字の高さを 23 より大きくするとうまくいく.
@MS Pゴシック」での () () 高さ 23
また,他のプロポーショナルフォントではうまくいくものもが多い.
@Meiryo UI

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

::IsFontInstalled (LPCTSTR pszFace)

EnumFont… を調べていて,::IsFontInstalled を見つけた.
MFC 6 位に追加されたみたいだが,static 宣言されている.
VC 6 RTM では存在していなさそう.
正確なタイミングはわからないが,VC 6 SP6 には存在していて …\MFC\SRC\CCDATA.CPP にある,
IsFontInstalled
フォントがインストールされているかのチェックに利用できそうなので,関数として定義予定.

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

CComboBox Get…Text() ?

CComboBox の選択項目の取得には GetLBText がある.
が,エディットボックス部分の取得方法がそこには書かれていない?
検索しても,あまりうまく引っかからない.


::GetWindowText(m_CtrlComboBox.GetSafeHwnd(),…) でいけそうなことは確認した.
Spy++ で見ると,エディットボックスの部分は「子ウィンドウ」になっている?


いろいろと調べると次の様なものもあり.
WindowsX.h
#define ComboBox_GetText(hwndCtl, lpch, cchMax) GetWindowText((hwndCtl), (lpch), (cchMax))


CComboBox の DDX_CBString を追加して,デバッガで追いかけると,::GetWindowText を呼出している.
DDX_CBString


MFC による Windows 95 プログラミングの 358 ページに次の様にあった.
コンボボックスの操作
… CWnd から継承している GetWindowText,SetWindowText 関数は,予想通り,エディットコントロール内のテキストを取得,設定する.


MFC だと次の様にできる.
CString str ;
m_CtrlComboBox.GetWindowText(str) ;

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

EnumFontFam…Proc

CALLBACK で呼び出されたものを FontType で分類して文字列の配列に登録.

#include	<Windows.h>

class	EnumFont	{
public:
	static	int	CALLBACK	CB_EnumFontFam		(const ENUMLOGFONT*   lpelf_,const NEWTEXTMETRIC*   lpntm_,DWORD font_type,LPARAM lparam) ;
	static	int	CALLBACK	CB_EnumFontFamEx	(const ENUMLOGFONTEX* lpelfe,const NEWTEXTMETRICEX* lpntme,DWORD font_type,LPARAM lparam) ;
protected:
public:
	v_tstring	Font_________ ;		//	0
	v_tstring	Font_raster__ ;		//	1	RASTER_FONTTYPE
	v_tstring	Font_device__ ;		//	2	DEVICE_FONTTYPE
	v_tstring	Font_truetype ;		//	4	TRUETYPE_FONTTYPE
	} ;

inline	int	CALLBACK	EnumFont::CB_EnumFontFam	(const ENUMLOGFONT*   lpelf_,const NEWTEXTMETRIC*   lpntm_,DWORD font_type,LPARAM p_this)
{
	const	LOGFONT&	lf = lpelf_->elfLogFont ;
	EnumFont*	pthis = (EnumFont*)p_this ;
	if      (font_type & RASTER_FONTTYPE)	{	pthis->Font_raster__.push_back(lf.lfFaceName) ;		}
	else if (font_type & TRUETYPE_FONTTYPE)	{	pthis->Font_truetype.push_back(lf.lfFaceName) ;		}
	else if (font_type & DEVICE_FONTTYPE)	{	pthis->Font_device__.push_back(lf.lfFaceName) ;		}
	else                                    	{	pthis->Font_________.push_back(lf.lfFaceName) ;		}
	return	1 ;
	}

inline	int	CALLBACK	EnumFont::CB_EnumFontFamEx	(const ENUMLOGFONTEX* lpelfe,const NEWTEXTMETRICEX* lpntme,DWORD font_type,LPARAM p_this)
{
	const	LOGFONT&	lf = lpelfe->elfLogFont ;
	EnumFont*	pthis = (EnumFont*)p_this ;
	if      (font_type & RASTER_FONTTYPE)	{	pthis->Font_raster__.push_back(lf.lfFaceName) ;		}
	else if (font_type & TRUETYPE_FONTTYPE)	{	pthis->Font_truetype.push_back(lf.lfFaceName) ;		}
	else if (font_type & DEVICE_FONTTYPE)	{	pthis->Font_device__.push_back(lf.lfFaceName) ;		}
	else                                    	{	pthis->Font_________.push_back(lf.lfFaceName) ;		}
	return	1 ;
	}

次の様に呼出し.

bool	test	(void)
{
	HWND	hWnd = ::GetConsoleWindow() ;
	HDC	hdc = ::GetDC(hWnd);
	{
		EnumFont	ef_ ;
		EnumFont	efe ;
		{
			::EnumFontFamilies  (hdc,NULL,(FONTENUMPROC)EnumFont::CB_EnumFontFam,  (LPARAM)&ef_) ;
			::EnumFontFamiliesEx(hdc,NULL,(FONTENUMPROC)EnumFont::CB_EnumFontFamEx,(LPARAM)&efe,0) ;
			}
		{
			tstring	tmp_path = ::Get_i_Tools_tmp_date() ;
			tstring	fet_name = ::Path_AddLastSP(tmp_path) + ::Now_Format(_T("%H%M%S")) + _T("_ffe_t.txt") ;
			tstring	fer_name = ::Path_AddLastSP(tmp_path) + ::Now_Format(_T("%H%M%S")) + _T("_ffe_r.txt") ;
			tstring	fed_name = ::Path_AddLastSP(tmp_path) + ::Now_Format(_T("%H%M%S")) + _T("_ffe_d.txt") ;
			tstring	fe__name = ::Path_AddLastSP(tmp_path) + ::Now_Format(_T("%H%M%S")) + _T("_ffe__.txt") ;
			tstring	f_t_name = ::Path_AddLastSP(tmp_path) + ::Now_Format(_T("%H%M%S")) + _T("_ff__t.txt") ;
			tstring	f_r_name = ::Path_AddLastSP(tmp_path) + ::Now_Format(_T("%H%M%S")) + _T("_ff__r.txt") ;
			tstring	f_d_name = ::Path_AddLastSP(tmp_path) + ::Now_Format(_T("%H%M%S")) + _T("_ff__d.txt") ;
			tstring	f___name = ::Path_AddLastSP(tmp_path) + ::Now_Format(_T("%H%M%S")) + _T("_ff___.txt") ;
			::SaveText(fet_name.c_str(),efe.Font_truetype) ;
			::SaveText(fer_name.c_str(),efe.Font_raster__) ;
			::SaveText(fed_name.c_str(),efe.Font_device__) ;
			::SaveText(fe__name.c_str(),efe.Font_________) ;
			::SaveText(f_t_name.c_str(),ef_.Font_truetype) ;
			::SaveText(f_r_name.c_str(),ef_.Font_raster__) ;
			::SaveText(f_d_name.c_str(),ef_.Font_device__) ;
			::SaveText(f___name.c_str(),ef_.Font_________) ;
			}
		}
	::ReleaseDC(NULL,hdc);
	return	true ;
	}

これで出力したもの.
EnumFontFam...Proc  FontType

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

::EnumFont…

幾つかの所で使用している ::EnumFont フォント 選択
文字列 DXF 変換  2023.09
最近追加したフォントでうまく列挙されないものがある.
先日試したコード では列挙されているので,コールバック関数の部分がうまくない.
フォントを列挙する部分は 20 年以上前に書いたコード.
間違ってはなさそうだが,MFC に依存しているので見直すことに.


プログラミング Windows 第5版 を見たが,1 ページ程度.
::EnumFonts , ::EnumFontFamilies , ::EnumFontFamiliesEx の違いなどが簡単に書かれている.


当時参考にしたのは,MFC による Windows 95 プログラミング だったみたい.ソースにコメントが残っていた.


コールバック関数の EnumFontFamExProc が呼ばれるのは,::EnumFontFamiliesEx が呼ばれた直後.
EnumFontFamExProc


インストールされているフォントの列挙
インストールされているフォントの列挙


::EnumFontFamilies と ::EnumFontFamiliesEx とでは,列挙される数が異なる.
EnumFontFamilies と EnumFontFamiliesEx で列挙されるフォント

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

AfxGetInstanceHandle

コンソール AP を変更していて「MFC を使用」にすると AfxGetInstanceHandle で ASSERT .
AfxGetInstanceHandle ASSERT

---------------------------
Microsoft Visual C++ Debug Library
---------------------------
Debug Assertion Failed!

Program: c:\Temp\TOutline\tolmba\Debug.060\tolmba.exe
File: afxwin1.inl
Line: 19

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.

(Press Retry to debug the application)
---------------------------
中止(A)   再試行(R)   無視(I)   
---------------------------

この単体テスト用プロジェクトは,最初 MFC を使用しないでコードを書いていた.
が,幾つかの機能を付けていくと MFC を使用した既存のコードが必要になった.
その中で AfxGetInstanceHandle() を呼出している所があり,そこで ASSERT .


次の様に MFC の初期化 ::AfxWinInit を追加して対応.

int	_tmain	(int argc,TCHAR* argv[])
{
	#ifdef	_MFC_VER
	if (!::AfxWinInit(::GetModuleHandle(NULL),NULL,::GetCommandLine(),0)) {
		return	1 ;
		}
	#endif
	_tsetlocale(LC_ALL,_T("")) ;
//	...
	return	0 ;
	}
Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

::EnumFontFamilies…

フォントを列挙する方法を「ChatGPT」と「Bingチャット」で問合わせてみた.


ChatGPT

#include <windows.h>
#include <iostream>

int main() {
    HDC hdc = GetDC(NULL);
    LOGFONT lf;
    memset(&lf, 0, sizeof(LOGFONT));
    lf.lfCharSet = DEFAULT_CHARSET;
    std::cout << "Available Fonts:" << std::endl;
    EnumFontFamiliesEx(hdc, &lf, (FONTENUMPROC)EnumFontFamiliesCallback, 0, 0);
    ReleaseDC(NULL, hdc);
    return 0;
}

int CALLBACK EnumFontFamiliesCallback(ENUMLOGFONTEX *lpelfe, NEWTEXTMETRICEX *lpntme, DWORD FontType, LPARAM lParam) {
    std::cout << lpelfe->elfFullName << std::endl;
    return 1;
}

Bingチャット

#include <windows.h>
#include <iostream>
#include <string>

int CALLBACK EnumFontFamExProc(ENUMLOGFONTEXW* lpelfe, NEWTEXTMETRICEXW* lpntme, DWORD FontType, LPARAM lParam)
{
    std::wcout << lpelfe->elfFullName << std::endl;
    return 1;
}

int main()
{
    HDC hdc = GetDC(NULL);
    LOGFONTW lf = { 0 };
    lf.lfCharSet = DEFAULT_CHARSET;
    EnumFontFamiliesExW(hdc, &lf, (FONTENUMPROCW)EnumFontFamExProc, 0, 0);
    ReleaseDC(NULL, hdc);
    return 0;
}

以前よりも精度が上がった様に感じる.
EnumFontFamilies...

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

WebGL での 3D データ表示

さらに,以前作成した Web サーバ を利用して WebGL での表示に

bool	test	(void)
{
	Vd2A	pts ;
	{
		pts.push_back(Vd2(  0,  0)) ;
		pts.push_back(Vd2( 70,  0)) ;
		pts.push_back(Vd2( 90, 50)) ;
		pts.push_back(Vd2(100,100)) ;
		pts.push_back(Vd2( 50,100)) ;
		pts.push_back(Vd2( 30, 70)) ;
		pts.push_back(Vd2( 40, 30)) ;
		pts.push_back(Vd2(  0,  0)) ;
		}
	vv_PLF	vvplf ;
	{
		Vd3A	v3a = ::ToVd3A(pts) ;
		Vd4A	v4a = ::ToVd4A(v3a) ;
		PLF	plf_l(PLF::line,v4a) ;
		PLF	plf_f(PLF::face,v4a) ;
		v_PLF	v_plf ;
			v_plf.push_back(plf_l) ;
			v_plf.push_back(plf_f) ;
			vvplf.push_back(v_plf) ;
		}
	{
		tstring	tmp_path = ::Get_i_Tools_tmp_date() ;
		tstring	out_name = ::Path_AddLastSP(tmp_path) + ::Now_Format(_T("%H%M%S")) + _T("__.htm") ;
		tstring	outtname = ::Path_AddLastSP(tmp_path) + ::Now_Format(_T("%H%M%S")) + _T("_t.htm") ;
		tstring	outnname = ::Path_AddLastSP(tmp_path) + ::Now_Format(_T("%H%M%S")) + _T("_n.htm") ;
		{
			GonsA	gnsa = ::PLF_ToGonsA(vvplf) ;
			::GonsA_ToWGL(gnsa,out_name.c_str()) ;
				gnsa = ::GonsA_Triangulation(gnsa) ;
			::GonsA_ToWGL(gnsa,outtname.c_str()) ;
				gnsa = ::GonsA_CalcNormal   (gnsa) ;
			::GonsA_ToWGL(gnsa,outnname.c_str()) ;
			}
		{
			::start_web_server(tmp_path) ;
			}
		}
	tstring	g3_d_exe = ::get_g3_d_exe() ;
	if (!g3_d_exe.empty()) {
		tstring	tmp_path = ::Get_i_Tools_tmp_date() ;
		tstring	ipl_name = ::Path_AddLastSP(tmp_path) + ::Now_Format(_T("%H%M%S")) + _T(".ipl") ;
		::To_ipl  (vvplf,ipl_name.c_str()) ;
		::start_g3_d(ipl_name.c_str()) ;
		}
	return	true ;
	}

簡易 Web サーバで WebGL

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

Linux での GLUT 3D データ表示

昨日のコードをもう少し汎用的に修正.そしてそれを他から呼出せるように変更.
次の様なコードで 3D データを生成して,GLUT で表示できる様にした.

bool	test	(void)
{
	Vd2A	pts ;
	{
		pts.push_back(Vd2(  0,  0)) ;
		pts.push_back(Vd2( 70,  0)) ;
		pts.push_back(Vd2( 90, 50)) ;
		pts.push_back(Vd2(100,100)) ;
		pts.push_back(Vd2( 50,100)) ;
		pts.push_back(Vd2( 30, 70)) ;
		pts.push_back(Vd2( 40, 30)) ;
		pts.push_back(Vd2(  0,  0)) ;
		}
	vv_PLF	vvplf ;
	{
		Vd3A	v3a = ::ToVd3A(pts) ;
		Vd4A	v4a = ::ToVd4A(v3a) ;
		PLF	plf_l__ (PLF::line,v4a) ;
		PLF	plf_f__ (PLF::face,v4a) ;
		v_PLF	v_plf ;
			v_plf.push_back(plf_l__) ;
			v_plf.push_back(plf_f__) ;
			vvplf.push_back(v_plf) ;
		}
	tstring	txt_name = ::g3_d_get_txt_name() ;
	{
		tstring	tmp_path = ::Get_i_Tools_tmp_date() ;
		tstring	ipl_name = ::Path_AddLastSP(tmp_path) + ::Now_Format(_T("%H%M%S")) + _T(".ipl") ;
		::To_ipl  (vvplf,ipl_name.c_str()) ;
		::SaveText(txt_name.c_str(),ipl_name) ;
		}
	{
		::exec_g3_d(txt_name.c_str()) ;
		}
	return	true ;
	}

g3_d_gl

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

GLUT を使用した 3D データの表示

個人的なメモです.
4 年位前に作成したコードで,凹多角形がうまく処理できていないものがあったのでその変更.

#include	"glut_cg.hxx"
#include	"gonsa_to.hxx"

#define		TIMING_DN	1000

//	int	_tmain	(int argc, _TCHAR* argv[])
int		main	(int argc,   char* argv[])
{
	{
		GonsA	gnsa ;
		{
			tstring	buf ;	buf.resize(1000) ;
			while (std::terr << _T("file ? =") , std::tin.getline(&buf[0],buf.size()))
			{
				tstring	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 ;	}
				tstring	in_file = str ;
				gnsa = ::To_GonsA(in_file.c_str()) ;
				gnsa = ::GonsA_Triangulation(gnsa) ;		//	2023/06/27
				gnsa = ::GonsA_CalcNormal   (gnsa) ;		//	2023/06/27
				if (gnsa.size() > 0)        {	break ;		}
				}
			if (gnsa.size() == 0)           {	return	0 ;		}
			}
		::set_GonsA(gnsa) ;
		::set_Extent(::GonsA_GetExtent(gnsa)) ;
		}
	::glutInitWindowPosition(200,200) ;
	::glutInitWindowSize    (600,400) ;
	::glutInitDisplayMode   (GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH) ;
	::glutInit              (&argc,argv) ;
	::glutCreateWindow      (argv[0]) ;
	::glutReshapeFunc       (cv_resize) ;
	::glutDisplayFunc       (cg_display) ;
	::glutKeyboardFunc      (cv_keyboard) ;
	::glutMouseFunc         (cv_mouse) ;
	::glutMotionFunc        (cv_motion) ;
	::glutTimerFunc         (TIMING_DN,cv_timer,TIMING_DN) ;
	::cv_init               () ;
	{
		::glEnable(GL_LIGHTING) ;
		::glEnable(GL_LIGHT0) ;
		}
	::glutMainLoop          () ;
	return	0 ;
	}

#include	"messbar.cxx"

t_gl_b_3.cpp
t_gl_b_3.exe

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