ホーム » 検索結果: Shell (ページ 2)

検索結果: Shell

2024年11月
 12
3456789
10111213141516
17181920212223
24252627282930

カテゴリー

アーカイブ

ブログ統計情報

  • 99,336 アクセス


error LNK2019 : … _GdiplusStartup

VC 6 で作成したプロジェクトを VC 8 に上げてビルドすると…

------ ビルド開始: プロジェクト: DocTh, 構成: Debug Win32 ------
リンクしています...
ComNGP01.obj : error LNK2019: 未解決の外部シンボル _GdipCreateSolidFill@8 が関数 "public: __thiscall Gdiplus::SolidBrush::SolidBrush(class Gdiplus::Color const &)" (??0SolidBrush@Gdiplus@@QAE@ABVColor@1@@Z) で参照されました。
ComNGP01.obj : error LNK2019: 未解決の外部シンボル _GdipDeleteBrush@4 が関数 "public: virtual __thiscall Gdiplus::Brush::~Brush(void)" (??1Brush@Gdiplus@@UAE@XZ) で参照されました。
ComNGP01.obj : error LNK2019: 未解決の外部シンボル _GdipCloneBrush@8 が関数 "public: virtual class Gdiplus::Brush * __thiscall Gdiplus::Brush::Clone(void)const " (?Clone@Brush@Gdiplus@@UBEPAV12@XZ) で参照されました。
ComNGP01.obj : error LNK2019: 未解決の外部シンボル _GdipFree@4 が関数 "public: static void __cdecl Gdiplus::GdiplusBase::operator delete(void *)" (??3GdiplusBase@Gdiplus@@SAXPAX@Z) で参照されました。
ComNGP01.obj : error LNK2019: 未解決の外部シンボル _GdipAlloc@4 が関数 "public: static void * __cdecl Gdiplus::GdiplusBase::operator new(unsigned int)" (??2GdiplusBase@Gdiplus@@SAPAXI@Z) で参照されました。
ComNGP01.obj : error LNK2019: 未解決の外部シンボル _GdipCreateLineBrushI@24 が関数 "public: __thiscall Gdiplus::LinearGradientBrush::LinearGradientBrush(class Gdiplus::Point const &,class Gdiplus::Point const &,class Gdiplus::Color const &,class Gdiplus::Color const &)" (??0LinearGradientBrush@Gdiplus@@QAE@ABVPoint@1@0ABVColor@1@1@Z) で参照されました。
ComNGP01.obj : error LNK2019: 未解決の外部シンボル _GdipCreateFromHDC@8 が関数 "public: __thiscall Gdiplus::Graphics::Graphics(struct HDC__ *)" (??0Graphics@Gdiplus@@QAE@PAUHDC__@@@Z) で参照されました。
ComNGP01.obj : error LNK2019: 未解決の外部シンボル _GdipDeleteGraphics@4 が関数 "public: __thiscall Gdiplus::Graphics::~Graphics(void)" (??1Graphics@Gdiplus@@QAE@XZ) で参照されました。
ComNGP01.obj : error LNK2019: 未解決の外部シンボル _GdipSetSmoothingMode@8 が関数 "public: enum Gdiplus::Status __thiscall Gdiplus::Graphics::SetSmoothingMode(enum Gdiplus::SmoothingMode)" (?SetSmoothingMode@Graphics@Gdiplus@@QAE?AW4Status@2@W4SmoothingMode@2@@Z) で参照されました。
ComNGP01.obj : error LNK2019: 未解決の外部シンボル _GdipFillRectangle@24 が関数 "public: enum Gdiplus::Status __thiscall Gdiplus::Graphics::FillRectangle(class Gdiplus::Brush const *,float,float,float,float)" (?FillRectangle@Graphics@Gdiplus@@QAE?AW4Status@2@PBVBrush@2@MMMM@Z) で参照されました。
ComNGP01.obj : error LNK2019: 未解決の外部シンボル _GdipFillRectangleI@24 が関数 "public: enum Gdiplus::Status __thiscall Gdiplus::Graphics::FillRectangle(class Gdiplus::Brush const *,int,int,int,int)" (?FillRectangle@Graphics@Gdiplus@@QAE?AW4Status@2@PBVBrush@2@HHHH@Z) で参照されました。
ComNGP01.obj : error LNK2019: 未解決の外部シンボル _GdipFillPie@32 が関数 "public: enum Gdiplus::Status __thiscall Gdiplus::Graphics::FillPie(class Gdiplus::Brush const *,float,float,float,float,float,float)" (?FillPie@Graphics@Gdiplus@@QAE?AW4Status@2@PBVBrush@2@MMMMMM@Z) で参照されました。
ComNGP01.obj : error LNK2019: 未解決の外部シンボル _GdiplusStartup@12 が関数 "public: static int __cdecl UseGdiPlus::Startup(void)" (?Startup@UseGdiPlus@@SAHXZ) で参照されました。
ComNGP01.obj : error LNK2019: 未解決の外部シンボル _GdiplusShutdown@4 が関数 "public: static int __cdecl UseGdiPlus::Shutdown(void)" (?Shutdown@UseGdiPlus@@SAHXZ) で参照されました。
c:\Temp\iShellE\DocTh\Debug.080/DocTh.exe : fatal error LNK1120: 外部参照 14 が未解決です。
DocTh - エラー 15、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ==========

ドキュメントに対する EMF  VC 8
リンク対象に Gdiplus.lib を追加して対応.

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

VirusTotal SmpTxt.exe

Synology NAS の Cloud Sync のログに,ダウンロードできないファイルが幾つかあった.
対象のファイルは SmpTxt.zip で,その中の SmpTxt.exe がうまくない様子.
VC 6 でビルドしたものがマルウェアなどとして検出されている.VC 8 でビルドしたものは問題ない.
VirusTotal  SmpTxt.exe
Vector に登録できているので誤検出だろうと思うが,どうしたものか.
i_ShellExt 未定義ドキュメントのサムネイルを表示可能に


2022/09/22
VC のバージョンをあげて対応することに.また SmpTxt.zip 内の VC 6 版は削除予定.


2022/09/26
SmpTxt_2022_09.zip

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.

::CreateMutex の名称

以前作成した W_mutex を利用.
同じドキュメントを開かない様なガードに使えると思い,単体テスト用のコードを書いた.

#include	"messbar.hxx"
#include	"itls_tmp.hxx"
#include	"cmd_line.hxx"
#include	"S_Exec.hxx"
#include	"W_mutex.hxx"

tstring	make_mutex_name	(const tstring& doc_name)
{
	tstring		mutex_name ;
	v_tstring	argv = ::get_arg() ;
	if (argv.size() > 0) {
		mutex_name += argv[0] ;
		mutex_name += _T(" ") ;
		}
	mutex_name += doc_name ;
///////////////////////////////////////////////////////////////
//	mutex_name = ::Path_Normalize(mutex_name,_T('/')) ;
///////////////////////////////////////////////////////////////
	std::terr << mutex_name << std::endl ;
	return	mutex_name ;
	}

bool	t_wait	(const tstring& doc_name)
{
	tstring		mutex_n = ::make_mutex_name(doc_name) ;
	size_t		bar_max = 1000 ;
	MessageBar	bar(_T("wait"),bar_max) ;
	for (size_t index=0 ; index<bar_max ; index++) {
		::Sleep(100) ;
		W_mutex	mutex(mutex_n.c_str()) ;
		bar.SetBarInc() ;
		if (mutex.Is_exist()) {
			}
		else {
			break ;
			}
		}
	return	true ;
	}

bool	t_loop	(const tstring& doc_name)
{
	tstring		mutex_n = ::make_mutex_name(doc_name) ;
	W_mutex		mutex(mutex_n.c_str()) ;
	size_t		bar_max = 100 ;
	MessageBar	bar(_T("loop"),bar_max) ;
	for (size_t index=0 ; index<bar_max ; index++) {
		bar.SetBarInc() ;
		::Sleep(30) ;
		}
	::Sleep(2000) ;
	return	true ;
	}

bool	test	(const tstring& doc_name)
{
	::t_wait(doc_name) ;
	::t_loop(doc_name) ;
	return	true ;
	}

int	_tmain	(int argc,TCHAR* argv[])
{
	_tsetlocale(LC_ALL,_T("")) ;
	::reg_argv(argc,argv) ;
	if (argc > 1) {
		test(argv[1]) ;
		}
	else {
		time_t	now = ::time(NULL) ;
		size_t	count = 5 ;
		tstring	test_cmd ;
		S_Exec	se ;
		{
			tstring	exe_name ;
			tstring	tmp_name ;
			{
				exe_name = argv[0] ;
				}
			{
				tstring	temp_dir = ::Get_i_Tools_tmp() ;
				tstring	time_str = ::Now_Format(_T("%H%M%S")) ;
					tmp_name = ::Path_AddLastSP(temp_dir) + time_str + _T(".tmp") ;
				}
			{
				test_cmd = exe_name + _T(" ") + tmp_name ;
				}
			{
				se.SetFile      (exe_name.c_str()) ;
				se.SetParamaters(tmp_name.c_str()) ;
				}
			{
				for (size_t index=0 ; index<count ; index++) {
					std::terr << test_cmd << std::endl ;
					se.Execute() ;
					::Sleep(2000) ;
					}
				}
			{
				::Sleep(1000) ;
				tstring		mutex_n = ::make_mutex_name(tmp_name.c_str()) ;
				size_t		bar_max = 1000 ;
				MessageBar	bar(_T("test wait "),bar_max) ;
				for (size_t index=0 ; index<bar_max ; index++) {
					W_mutex	mutex(mutex_n.c_str()) ;
					if (mutex.Is_exist()) {
						bar.SetBarInc() ;
						::Sleep(100) ;
						}
					else {
						break ;
						}
					}
				}
			}
		}
	return	0 ;
	}

#include	"messbar.cxx"

Mutex の名称としては,exe 名とドキュメント名を連結したものとした.


最初,実行させるとうまく動作しない(Mutex オブジェクトが存在するはずなのに抜ける).
::CreateMutex に与えている名称がうまくなかった.’\’ が使えない.
パスの区切りを ‘/’ に変更してうまくいった.
CreateMutex の名称で '\' は使えない


次の様なコードをアプリケーションクラスの InitInstance に追加.

	{
		if (cmdInfo.m_nShellCommand == CCommandLineInfo::FileOpen) {
			tstring	doc_name = cmdInfo.m_strFileName ;
			tstring	exe_name = ::Get_module_name() ;
			tstring	mtx_name = exe_name + _T(" ") + doc_name ;
				mtx_name = ::Path_Normalize(mtx_name,_T('/')) ;
			static	W_mutex	mutex(mtx_name.c_str()) ;
			if (mutex.Is_exist()) {
				return	FALSE ;
				}
			}
		}
Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

高 DPI

先日の更新で,ツールバーのボタンが小さくなった?という報告を受けたので,ちょっとまとめてみた.

DPI 認識 DPI 対応 「互換性」タブ
なし 非対応 システム
高い DPI 認識 システム  
モニターごとの高い DPI 認識 モニターごと アプリケーション

プロジェクトの「プロパティ」-「マニフェストツール」-「DPI 認識」
「タスクマネージャー」での表示
上から,非対応,システム,モニターごとx2 .下から 2 つ目は,100% のディスプレイから移動したもの.
GLSmth の「バージョン情報」

高 DPI デバイスでの Windows のスケーリングの問題
PROCESS_DPI_AWARENESS enumeration (shellscalingapi.h)
C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\um\ShellScalingApi.h

いろいろ試したが,特にツールバーボタンの関係ではわからなかった.


2021/10/14
どうも,プライマリディスプレイの設定によりスケーリング動作が異なる?
ImageLook タスクマネージャ
125% にしたもの.
プライマリディスプレイを 125% に
右下の 3 つのツールバーとダイアログの大きさなどがスケーリングされない.
それら以外の,メニューやステータスバーなどは正しくスケーリングされている様に見える.
VirtualBox の「スケールモード」で 80% 程度にしたもの.
80% 程度にして,ホストのウィンドウを重ね合わせ


exe のプロパティで「アプリケーション」としたもの.
exe のプロパティで「アプリケーション」に
ダイアログのフォントに固定サイズのものを使用しているので少し文字間隔が広くなってしまっている.
https://jml.mish.work/index.php/i-tools/setcolt.html

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.

MFC ドキュメントの関連付け

スケルトン作成時,ファイルの拡張子を指定しなかったプロジェクトに,後から関連付けのコードを追加する手順.


アプリケーションクラスの InitInstance に EnableShellOpen と RegisterShellFileTypes を追加.

BOOL CXxxxApp::InitInstance()
{
	//	...
	AddDocTemplate(pDocTemplate);

	// DDE Execute open を使用可能にします。
	EnableShellOpen();  
	RegisterShellFileTypes(TRUE);  

	// DDE、file open など標準のシェル コマンドのコマンドラインを解析します。
	CCommandLineInfo cmdInfo;
	ParseCommandLine(cmdInfo);

	//	...

	// メイン ウィンドウが初期化されたので、表示と更新を行います。
	m_pMainWnd->ShowWindow(SW_SHOW);
	m_pMainWnd->UpdateWindow();

	// ドラッグ/ドロップ オープンを許可します
	m_pMainWnd->DragAcceptFiles();  

	return TRUE;
	}

必要に応じて,DragAccesptFiles .


リソースの String Table IDR_MAINFRAME で,ファイルタイプと拡張子を指定する.
文字列は 7 つに区切られている.CDocTemplate::GetDocString
CDocTemplate DocStringIndex


最近の Windows は,RegisterShellFileTypes では登録できない.
そのため,自前の RegFileType::SetFileType(TRUE) を呼出す.
RegFType.hxx RegFType.cxx
RegisterShellFileTypes とは違い,HKEY_CURRENT_USER\Software\Classes\ に登録している.

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

MDI exe が動作しない?

Win10 Insider Preview 21H1 環境で,幾つかの exe がうまく動作しない.
引数が正しくありません。
VC 8 でビルドした exe は OK .VC 10 以降は NG のものがある.
SDI exe は大丈夫そうで,MDI exe はすべてではないが NG のものが多い.
タイミングとしては,3D データを読み込んだ後,ウィンドウに表示する前.


2021/07/12
一度「開く」ダイアログを表示するとその後はうまく動作する.


SDI exe であっても,VC 14 MFC スタティックだとうまくない?
MFC をスタティックリンクした exe でうまく動作しない
これはプロジェクトの設定がまずかったためで,別の記事に


2021/04/01
ちょっとわからないので,リモートデバッグの環境を作成することに.
MSDN Visual Studio での C++ プロジェクトのリモート デバッグ
リモートツールをダウンロードして,インストール.「スタート」から「Remote Debugger」を起動.
VS 2017 Remote Debugger
リモート側で exe を実行して,ホスト側で「アタッチ」.
VS でリモートのプロセスにアタッチ


2021/04/02
原因は,CRecentFileList::Add を通った時 ::CoInitinalize が呼び出されていないため.
CRecentFileList::Add  0x800401f0:CoInitialize は呼び出されていません
どうも MFC 10 から?変わったみたい.
MS C++ executable just started failing
MFC application crashing in ProcessShellCommand() when file to open specified on command line
それでも,なぜ環境によっては表面化しないのか?


CRecentFileList::Add で Win7 以降の「ジャンプリスト」に登録(::SHAddToRecentDocs )する様になった.
Win10 20H2 でも現象は発生した.2004 では問題ない.


対応としては InitInstance の最初に以下を追加.

	// OLE ライブラリを初期化します。
	if (!AfxOleInit()) {
		AfxMessageBox(_T("OLE の初期化に失敗しました。")) ;
		return	FALSE ;
		}

2021/04/06
2016/夏頃の Win10 で,その様になるものが存在したみたい.
その頃は T90Chi + VC 2015 + i3DV でやっていたと思うが,気づかなかった?

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

MFC 起動時のドキュメントの変更

ドキュメントのドロップ時のファイル名の変更 には対応したが,今度は起動時のドキュメントの変更.
InitInstance の所をデバッガで追いかけると,CWinApp::ProcessShellCommand の前後で対応できそう.
CWinApp::ProcessShellCommand
次の様に,対象のファイルを変更して起動できることは確認.

	CCommandLineInfo cmdInfo;
	ParseCommandLine(cmdInfo);
	{
		if (cmdInfo.m_nShellCommand == CCommandLineInfo::FileOpen) {
			cmdInfo.m_strFileName = ::Path_ChangeExt(cmdInfo.m_strFileName,_T("ig3")).c_str() ;
			}
		}
	if (!ProcessShellCommand(cmdInfo))
	//	...
Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

SDI exe でファイルのドロップ

SDI exe でファイルをドロップされた時,関連する異なるファイルを開きたくなった.
次の様に,変換済みのデータが存在している時はそれを対象とする.
https://dev.mish.work/wordpress/2021/03/03/win-prevent-2nd/


ドキュメントクラスの OnOpenDocument で変更するのは可能だが「MRU ファイル リスト」に残ってしまう.


15 年位前に,ブラウザからリンクをドロップして動作させるコードを書いた.
最近のブラウザでは,当時の様な操作はできないみたい.
WM_DROPFILES でリンクのテキストが取れたのだったと思う.
この時,何を参考にしてここにたどり着いたかは不明.
それを見ると CMainFrame::OnDropFiles にコードが書いてある.
デフォルトのコードとしては,CFrameWnd::OnDropFiles を呼出している.
CFrameWnd::OnDropFiles
::DragQueryFile でファイル名を取って CWinApp::OpenDocumentFile を呼出している.


CMainFrame::OnDropFiles でファイル名を取った後,処理を追加して CWinApp::OpenDocumentFile を呼べば良い.
手順としては (VC)\…\atlmfc\src\mfc\winfrm.cpp の CMainFrame::OnDropFiles をコピーして編集している.

void CMainFrame::OnDropFiles(HDROP hDropInfo) 
{
	SetActiveWindow();      // activate us first !
	CWinApp* pApp = AfxGetApp();
	ASSERT(pApp != NULL);
	v_tstring	files = ::DropFilesTo(hDropInfo) ;
	if (files.size() > 0) {
		tstring	file = files[0] ;
	//	ここで,必要に応じてファイル名を変更するなどの処理
		pApp->OpenDocumentFile(file.c_str()) ;
		}
	::DragFinish(hDropInfo);
//	CFrameWnd::OnDropFiles(hDropInfo);
	}

今回は SDI なのでこんな感じ.MDI であればループで回せば良い.

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

Win 環境で 2 重起動の禁止

ライブラリとして提供されている部分を,他のコードと分離するためコンソール AP(変換 exe)として作成.
テスト用にそれを呼出す部分も別のコンソール AP(呼出 exe)として作成.
変換 exe は,aaa.dat を aaa.txt の様に異なる形式に変換する機能.
呼出 exe は,::ShellExecute(…,”変換.exe aaa.dat”,…) の様に呼出し aaa.txt を処理する.
データにより変換(*.dat から *.txt へ)時間は数秒から数時間.
変換できたかどうかをチェックしている部分は次の様なコード.

for (size_t index=0 ; index<1000 ; index++) {
	::Sleep(100) ;
	if (::File_IsExist(g3d_name))	{	break ;		}
	}

データが悪いのか,ライブラリの問題なのかは不明たが,変換 exe の中でエラーになってしまうことがある.
エラーを軽減する方法はわかっているが,それでも完全ではない.
同じデータでも通る時とそうでないことがあり不安定.
そのため,変換後データが存在しない時に,変換中でなければ「変換 exe」を再起動させなければならない.


2021/03/09
ここまでの部分を単体のコードとして作成.
t_call.cpp
t_conv.cpp
T_mtex_2021_03_09.zip
変換 exe 呼出し 単体テスト
これらのコードでの問題は,
* 異常終了が判断できない.
* 変換に時間がかかる時,複数回呼んでしまう.


起動しているかどうかは Mutex を使えば良さそう.
変換 exe が起動している間,::CreateMutex (…,”入力ファイル名”) で作成したものを保持する.
呼出 exe のループでは,その Mutex が存在するかチェック.
なくなった時に,出力ファイルが存在している時はループを抜ける.
出力ファイルが存在していない時は,もう一度「変換 exe」を呼出す.


今まで作成の Mutex を使用したコード.
Prevent2.hxx Prevent2.cxx
ExclusS.hxx


t_conv.cpp

bool	test	(const tstring& name_in_)
{
	tstring	f_name = ::Path_GetName(name_in_) ; 
	HANDLE	hMutex = ::CreateMutex(NULL,FALSE,f_name.c_str()) ; 
	time_t	now = ::time(NULL) ;
	if ((now % 3) == 0) {
		::Sleep(3000) ;
		tstring	name_out = name_in_ + _T(".out") ;
		tstring	name_uni = ::Get_unique_name(name_out) ;
		::File_CreateEmpty(name_uni) ;
		}
	else {
		::Sleep(500) ;
		}
	::CloseHandle(hMutex) ; 
	return	true ;
	}

t_call.cpp

bool	t_call	(c_tstring& in_name_)
{
	tstring	name_in_ = in_name_ ;
	{
		tstring	f_name = ::Path_GetName(name_in_) ; 
		HANDLE	hMutex = ::CreateMutex(NULL,FALSE,f_name.c_str()) ; 
		DWORD	error  = ::GetLastError() ; 
		::CloseHandle(hMutex) ; 
		if (error == ERROR_ALREADY_EXISTS) { 
			return	true ; 
			} 
		}
	tstring	this_exe = ::i_GetModuleFileName() ;
	tstring	conv_exe = ::Path_AddLastSP(::Path_GetDir(this_exe)) + _T("t_conv.exe") ;
	    	name_in_ = ::QuotM_Add_Auto(name_in_) ;
	//	...
	//	変換 exe を起動
	//	...
	return	true ;
	}

Mutex で exe の起動を管理


2021/03/10 更にクラスに.W_mutex.hxx
次の様にできる.

bool	test	(const tstring& name_in_)
{
	W_mutex	mutex(::Path_GetName(name_in_).c_str()) ; 
	time_t	now = ::time(NULL) ;
	if ((now % 3) == 0) {
		::Sleep(3000) ;
		tstring	name_out = name_in_ + _T(".out") ;
		tstring	name_uni = ::Get_unique_name(name_out) ;
		::File_CreateEmpty(name_uni) ;
		}
	else {
		::Sleep(500) ;
		}
	return	true ;
	}

bool	t_call	(c_tstring& in_name_)
{
	tstring	name_in_ = in_name_ ;
	{
		W_mutex	mutex(::Path_GetName(name_in_).c_str()) ; 
		if (mutex.Is_exist())	{	return	true ;	} 
		}
	tstring	this_exe = ::i_GetModuleFileName() ;
	tstring	conv_exe = ::Path_AddLastSP(::Path_GetDir(this_exe)) + _T("t_conv.exe") ;
	    	name_in_ = ::QuotM_Add_Auto(name_in_) ;
	//	...
	return	true ;
	}

2021/12/01
W_mutex を利用した単体テスト用コード

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

CMutex の使用でデッドロック?

何年も前(2015/11?)からなのかもしれないが,
今の PC になってから作成した exe が起動時やサムネイルの表示などで停止する現象が時々発生している.
「ファイル更新監視」が停止
発生する頻度が低いのと,現象が絞り切れていなかったのでそのままになっていた.


今日,デバッグしていると exe が起動しない.
その時までに起動済みのものは動作しているが,止まってしまうものもあり.
以前この現象が発生した時は再起動することで回避したが,今回はもう少し調べてみることにした.


デバッガで追いかけると CMutex の Lock(INFINITE) で戻って来ない
CMutex Lock(INFINITE) で戻って来ない
使用している所は次の様な感じ.

{
	_MutexS_  mt(FALSE,_T("DocIB::GetBitmap")) ;
	MutexS    m(&mt) ;
	{
	//	共有のリソースに対する操作
		}
	}

通常の動作では Unlock されないことがある様には思えないが…
デバッガを使っていて Lock 中に exe を強制終了してしまったか?

_MutexS_	UseGdiPlus::ME(FALSE,_T("UseGdiPlus::GP_Token")) ;

{
	MutexS	me(&ME) ;
	if (IsInitialized())	{
		//	...
		}
	//	..
	}

いい修正方法が思い浮かばないので,とりあえずメモ.


2021/02/19
その後いろいろと検索して調べたが,通常の動作ではロックされたままとなることはなさそう.
https://docs.microsoft.com/ja-jp/dotnet/standard/threading/mutexes


表示されてはないが起動したままの exe があるかと思い,タスクバーを見たが特になさそう.
昨日,わかっているものの幾つかは「タスクの終了」で終わらせている.
そうなるとロックされている Mutex は,自前のシェルエクステンションと思われる.
「タスクバー」に表示されている「エクスプローラ」は終了させたが,まだ誰かがロックしている.
画面には表示されていない explorer.exe が幾つかか存在したので,すべて終わらせた.
これでロックされた Mutex は解放されたみたい.


今度は,デバッガを使用してうまく起動しなかった exe をいろいろ試すことに.
デバッガで Lock した直後にブレイクポイントを設定して停止.
当然であるが他の exe を起動すると Lock の所で止まってしまう.
デバッガで Unlock の後まで実行すると,他の exe も止まっていた所から動き出す.


デバッガで Lock した直後に停止させて,他の exe を起動.
デバッガで「デバッガの停止」してみる(Unlock していない)と,他の exe が動き出す.


これらの動作を見ると,使い方としてはそれ程間違ってはなさそう.
コードを追いかける限りでは,「マズい」所がわからない.
複数のプロセスから呼ばれた時に意図しないタイミングとなってしまう所があるのか?
ある程度はっきりしたのは,自前のシェルエクステンションの GDIPlus 関係の時の Lock で止まっていること.

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

ドキュメント付きの起動で抜ける?

個人的なコートでのメモです.


普通に exe を起動してドキュメントを開くのは問題ない.
ドキュメント付きで起動すると,ウィンドウが表示されて,ドキュメントを読込み後終了してしまっている.
コマンドライン引数の設定
デバッガで追いかけると,ProcessShellCommand の呼び出しで FALSE となっている.
ProcessShellCommand の結果が FALSE
原因は,ドキュメントの読込み後にアプリケーションクラスにアクセスしている所で初期化が済んでないため.
初期化のコード(RcntFM)を CCommandLineInfo の前にして対応.

	// メイン MDI フレーム ウィンドウを作成
	CMainFrame* pMainFrame = new CMainFrame;
	if (!pMainFrame->LoadFrame(IDR_MAINFRAME))
		return FALSE;
	m_pMainWnd = pMainFrame;
	// ドラッグ/ドロップ オープンを許可します
	m_pMainWnd->DragAcceptFiles();
	{
		RcntFM.Read() ;
		RcntFM.SetStartID(ID_RECENT_FILE_00) ;
		}
	// DDE、file open など標準のシェル コマンドのコマンドラインを解析します。
	CCommandLineInfo cmdInfo;
	ParseCommandLine(cmdInfo);
	if (cmdInfo.m_nShellCommand == CCommandLineInfo::FileNew) {
		cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing ;
		}
	// コマンドラインでディスパッチ コマンドを指定します。
	if (!ProcessShellCommand(cmdInfo))
		return FALSE;

これをやっていて困ったのが,ソースのタイル表示.
VC 2019 タイル表示
VS 2019 ではうまく動作するが,2017 など他のものではエラーになってしまう.
VC 2015 タイル表示でアプリケーションエラー

---------------------------
GLSm140: devenv.exe - アプリケーション エラー
---------------------------
0x000000006359C044 の命令が 0x0000000000000000 のメモリを参照しました。メモリが read になることはできませんでした。
プログラムを終了するには [OK] をクリックしてください
プログラムをデバッグするには [キャンセル] をクリックしてください
---------------------------
OK   キャンセル   
---------------------------
Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

ドライブ名からリモート名に

ネットワークドライブ名から UNC での表現に変換するコード.

#include	<clocale>
#include	"i_trace.hxx"

//#include	<winnetwk.h>
#pragma		comment	(lib,"mpr.lib")

tstring	W_get_remote_name	(LPCTSTR path_)
{
	tstring	dpath = path_ ;
	if (dpath.size() < 2)		{	return	dpath ;		}
	tstring	drive = dpath.substr(0,2) ;
	tstring	_path = dpath.substr(2) ;
	tstring	remote_path ;
	if (drive.length() == 2) {
		if (drive[1] == _T(':')) {
			u_16	d_t  = ::GetDriveType(drive.c_str()) ;
			if (d_t == DRIVE_REMOTE) {
				DWORD	buf_size = MAX_PATH ;
				tstring	remote_name ;
				remote_name.resize(buf_size+1) ;
				::WNetGetConnection(drive.c_str(),&remote_name[0],&buf_size) ;
				if (!remote_name.empty()) {
					remote_path = remote_name.c_str() + _path ;
					}
				}
			}
		}
	if (remote_path.empty())	{	return	dpath ;		}
	return	remote_path ;
	}

bool	Test	(void)
{
	for (long index=0 ; index<26 ; index++)	{
		tstring	drv  ;
				drv += TCHAR(_T('A')+index) ;
				drv += _T(":\\") ;
	//	if (index%2 == 0)
		{
			u_16	d_t  = ::GetDriveType(drv.c_str()) ;
			if (d_t == DRIVE_REMOTE) {
				drv += _T("*.*") ;
				v_tstring	files = ::EnumFiles(drv.c_str()) ;
				if (files.size() > 0) {
					drv = files[0] ;
					}
				}
			}
		drv += _T("                                      ") ;
		tstring	info = drv.substr(0,20) + _T("\t") + W_get_remote_name(drv.c_str()) ;
		{
			std::tout << info << std::endl ;
			}
		}
	return	true ;
	}

int	_tmain	(int argc,TCHAR* argv[])
{
	_tsetlocale(LC_ALL,_T("")) ;
	{
		::Test() ;
		}
	return	0 ;
	}

WNetGetConnection と net use
net use 」とコマンド入力することで似た様なことを確認できる.


管理者で起動した PowerShell の Get-SmbConnection で SMB のバージョンを確認できる.
ファイル共有で使われている SMB のバージョンを見る
Get-SmbConnection


S_open_2024_04.zip

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

FindExecutable と C2664

::FindExecutable の動作を確認しようと思い次の様なコードを書いた.

#include	<clocale>
#include	<iostream>

#include	<Windows.h>

#include	"i_define.hxx"
#include	"tstring.hxx"

tstring	Get_doc_exe	(LPCTSTR doc)
{
	tstring	exe_path ;
	exe_path.resize(MAX_PATH,0) ;
	::FindExecutable(doc,NULL,&exe_path[0]) ;
	return	exe_path.c_str() ;
	}

int	_tmain	(int argc,TCHAR* argv[])
{
	_tsetlocale(LC_ALL,_T("")) ;
	{
		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 ;	}
				std::tout << ::Get_doc_exe(str.c_str()) << std::endl ;
				}
			}
		}
	return	0 ;
	}

MBCS でビルドすると問題ないが,UNICODE にすると,

--------------------構成: get_exe - Win32 Release--------------------
コンパイル中...
get_exe.cpp
C:\Documents and Settings\All Users\Documents\Develop\VC_Test\PC_doc\get_exe\get_exe.cpp(37) : error C2664: 'class std::basic_istream<unsigned short,struct std::char_traits<unsigned short> > &__thiscall std::basic_istream<unsigned short,struct std::
char_traits<unsigned short> >::getline(unsigned short *,int)' : 1 番目の引数を 'char *' から 'unsigned short *' に変換できません。 (新しい機能 ; ヘルプを参照)
        指示された型は関連がありません; 変換には reinterpret_cast、 C スタイル キャストまたは関数スタイルのキャストが必要です。
C:\Documents and Settings\All Users\Documents\Develop\VC_Test\PC_doc\get_exe\get_exe.cpp(37) : fatal error C1903: 直前のエラーを修復できません; コンパイルを中止します。
cl.exe の実行エラー

get_exe.exe - エラー 2、警告 0

C2664 については ここ
Windows.h の include を i_define.hxx より後に.


::FindExecutable ではうまくない様な記述もあるが,今回の目的にはこれで良いかなと思う.
https://dobon.net/vb/dotnet/system/findassociatedexe.html
::FindExecutable を使用した動作テスト
https://itl.mydns.jp/…/get_exe_2020_09.zip


更にちょっと面白い動作があったので…

#include	"i_define.hxx"
#include	"tstring.hxx"
#include	<Windows.h>

#include	<clocale>
#include	<iostream>

int	_tmain	(int argc,TCHAR* argv[])
{
	_tsetlocale(LC_ALL,_T("")) ;
	{
		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 ;		}
				if (str.empty())		{	continue ;	}
				::ShellExecute(NULL,NULL,str.c_str(),NULL,NULL,SW_SHOWNORMAL) ;
				}
			}
		}
	return	0 ;
	}

関連付けされているドキュメントは,::ShellExecute で普通に開く.
そうでないドキュメントは,エクスプローラでクリックしたのと同じような動作.
NotePad や MSPaint などと入力すると,幾つかの exe は起動できる.
起動できないものもあり,その違いは不明.
https://itl.mydns.jp/…/se_doc_2020_09.zip

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

ショートカット作成

ショートカット作成の CreateLink のドキュメントの場所など
CreateLink
CSIDL
KNOWNFOLDERID


サンプルの ::CreateLink を利用したコード.
呼出している所は次の様なコード.lnk がなければ CreateLink .あれば削除.
UNICODE 版としてビルドする必要がある.

	if (_taccess(lnk_path,0) != 0) {
		::CoInitialize(NULL) ;
		char	mb_lnk_path[MAX_PATH] ;
		::WideCharToMultiByte(CP_ACP,0,lnk_path,-1,mb_lnk_path,MAX_PATH,NULL,NULL) ;
		::CreateLink(exe_path,mb_lnk_path,descript) ;
		::CoUninitialize() ;
		}
	else {
		_tremove(lnk_path) ;
		}

CreatLnk.cpp
CreatLnk.zip


サンプル状態では使い勝手が良くないので,幾つか修正.

HRESULT	CreateLink	(
	LPCTSTR	lpszPathObj ,		//	LPCWSTR
	LPCWSTR	lpszPathLink ,		//	LPCSTR
	LPCTSTR	lpszDesc ,		//	LPCWSTR
	LPCTSTR	workingFolder ,		//	作業フォルダ
	WORD	hotkey = 0		//	
	)

CreatLnk.hxx
CreateLink


_UNICODE を指定してビルドすると

--------------------構成: T_Lnk - Win32 Release--------------------
コンパイル中...
T_Lnk.cpp
\\DevS\Documents\Develop\_.SRC\__CPR_\xtot.hxx(83) : error C2679: 二項演算子 '=' : 型 'unsigned short [2]' の右オペランドを扱う演算子は定義されていません。(または変換できません)(新しい動作; ヘルプを参照)
\\DevS\Documents\Develop\_.SRC\__CPR_\xtot.hxx(103) : error C2679: 二項演算子 '=' : 型 'unsigned short [2]' の右オペランドを扱う演算子は定義されていません。(または変換できません)(新しい動作; ヘルプを参照)
\\DevS\Documents\Develop\_.SRC\__CPR_\ttox.hxx(34) : error C2664: 'wcstoul' : 1 番目の引数を 'const char *' から 'const unsigned short *' に変換できません。 (新しい機能 ; ヘルプを参照)
        指示された型は関連がありません; 変換には reinterpret_cast、 C スタイル キャストまたは関数スタイルのキャストが必要です。
\\DevS\Documents\Develop\_.SRC\__CPR_\ttox.hxx(34) : fatal error C1903: 直前のエラーを修復できません; コンパイルを中止します。
cl.exe の実行エラー
T_Lnk.exe - エラー 4、警告 0

UNICODE などの定義が矛盾していることがあるのでそれを最初に指定する.
// (VS8)\VC\AtlMFC\Include\AfxV_W32.h

#ifdef	_MSC_VER
	#ifdef		_UNICODE
		#ifndef	 UNICODE
		#define	 UNICODE		// UNICODE is used by Windows headers
		#endif
	#endif
	#ifdef		 UNICODE
		#ifndef	_UNICODE
		#define	_UNICODE		// _UNICODE is used by C-runtime/MFC headers
		#endif
	#endif
#endif

https://dev.mish.work/wordpress/2020/09/25/i_def_aw-hxx/


2020/10/14
作成した CreateLink の引数.
IID_IPersistFile の Save は LPCOLESTR になっている.
IID_IPersistFile
IID_IShellLink は _UNICODE かどうかでそれぞれが使用される.
IID_IShellLink


lnk 作成

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

CFileStatus でアサート

ファイルの作成日時が正しくない?と CFileStatus でうまく動作しない.


このファイルは,プログラミング Windows 第5版の CD を Mac でコピーしたもの.
このファイルを CFile::GetStatus とすると,アサートなど.
VC 8 の場合,ATLTime.inl CTime コンストラクタの 200 行目付近で
  if(m_time == -1)
  {
    AtlThrow(E_INVALIDARG);
    }


—————————
TsHBMP
—————————
パラメータが間違っています。
—————————
OK
—————————


CFileStatus を使わずに,stat を使用する様に書換えてある程度は動作する様になった.
VC 14 では,stat がエラーで帰ってくる.この対応方法は不明.
CFileStatus を使用している所はかなりあるため,すべてに対応するにはしばらくかかる.
今回は Shell Extension でダウンしたため,その部分のみ対応.

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

Win 10 Pro 10240 にインストールできない

2015/03 頃はインストールできたと思うが…


2015/09/11
IIS をアンインストールして,インストール(「Windows の機能の有効化または無効化」)してみたがダメ.


手作業で環境を作成しようとして…
  オートメーションの部分が起動できない.
幾つかのいつもの設定は行ってたが,ちょっと忘れていて,
  exe などを置いていたフォルダのアクセス権を正しく設定してなかった.
  他に今回の固有の環境であるが,レジストリから登録情報を削除する必要もあった.


うまく動作したのは VC 8 Static MFC だったが VC 12 DLL にすると,またうまく動作しない?
VC 12 Static にしてもダメで VC 8 Static に戻したのに,今度はうまくない.
Win 10 を再起動してうまく通った.
うまく動作しなくなった後,タスクマネージャから終了できないものがありそれが影響するのか?


もう一回 VC 12 でビルドしたものにチャレンジ.
VC 12 Static MFC は通った.
VC 12 DLL MFC でも通り,結局原因は掴めず.


今回の事とは直接関係ないが,エクスプローラが何度か落ちた.
OS 自体の問題なのか,作成した シェルエクステンション の問題なのかは不明.

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

‘THIS_FILE’ がシンタックスエラーを…

今まで通っていたプロジェクトで,
  ComPrj03.cpp
  c:\…\memory(16) : error C2061: 構文エラー : 識別子 ‘THIS_FILE’ がシンタックスエラーを起こしました。
  c:\…\memory(17) : error C2091: 関数は関数を返せません。
  c:\…\memory(17) : error C2809: ‘operator new’ に仮引数リストがありません。
  c:\…\memory(20) : error C2954: テンプレートの定義はネストできません。
  cl.exe の実行エラー
  ComPrj03.obj – エラー 4、警告 0


ソースの先頭付近に #include <memory> を追加.
  #include “StdAfx.h”
  #include “ComPrj00.hpp”
  #include <memory>
 


2019/01/18

--------------------構成: MkZIP2 - Win32 Release--------------------
コンパイル中...
MkZIP2.cpp
リンク中...

MkZIP2.exe - エラー 0、警告 0
--------------------構成: MkZIP2 - Win32 Debug--------------------
コンパイル中...
MkZIP2.cpp
c:\program files\microsoft visual studio\vc98\include\memory(16) : error C2061: 構文エラー : 識別子 'THIS_FILE' がシンタックスエラーを起こしました。
c:\program files\microsoft visual studio\vc98\include\memory(17) : error C2091: 関数は関数を返せません。
c:\program files\microsoft visual studio\vc98\include\memory(17) : error C2809: 'operator new' に仮引数リストがありません。
c:\program files\microsoft visual studio\vc98\include\memory(20) : error C2954: テンプレートの定義はネストできません。
cl.exe の実行エラー

MkZIP2.exe - エラー 4、警告 0

#include “stdafx.h”
#include “MkZIP2.h”
#include <ShlObj.h>
#import <Shell32.dll> // named_guids
//#include <memory>


エラーになるのはデバッグ版のビルド.リリース版では通る.
#include <memory> を有効に.


2023/03/24
#define new DEBUG_NEW より後にインクルードしているとうまくない error C2061 , C2091 , C2809 , C2556

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

Fedora をインストール

Mac の VirtualBox に Fedora をインストール.
  最初,WIn 7 の VirtualBox に Ubuntu をインストールした.
  インストール直後は動作していたが,そのうち起動時にブルースクリーンとなることがあった.
  以前 Android 環境を入れた時もそうだったので,VirtualBox との相性か?


ホームにできるフォルダが日本語名となるため検索すると,
  ホームディレクトリのフォルダ名を日本語から英語に変更するには


2013/06/26
環境を作成した時点では,うまく Windows Network が見えなかったが,…
  今開いてみたら見える様になっていた.


2013/06/27
デスクトップをカスタマイズしようと,ここを参考に GNOME Shell を有効に,…
  インストール後,再起動して,「GNOME Shell 拡張機能」の場所がわからなかったので,
    「アクティビティ」-「アプリケーションの表示」-「Tweak Tool」.
      「検索ワードを入力…」に “Tool” と入力するか,「アクセサリ」で絞った方がはやいかも.

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