..




2025/01/29

	多くのコードが必要になってきたため,ひとまず中断.

		RegFType.?xx は,RSFType.hpp として書き換え.

			クラス名は RegFileType から RFileType に.

			レジストリのアクセスに関しては,RegAccess から REG_key を使用したものに書き換え.

				但し,途中のため REG_Access を挟んだものにしているのと,REG_rsft としている.


		使用する時 #define	_REG_rsft_ とすることにより,REG_rsft.hpp と RSFType.hpp だけの利用となる.

			定義されていない場合は,REG_rsft.hpp は使われず RI_REG.hxx の方になる.

			_REG_rsft_ を定義しているプロジェクト	・・・	rsftM ,rsftS 

			RSFType.hpp で実装したプロジェクト  	・・・	MBPV





2025/01/28

	HKCR に書けない(管理者権限で起動していない)場合は,HKCU\Software\Classes\ 以下の同じ所に書き込む

		HKEY_CLASSES_ROOT \\                      .ext
		HKEY_CURRENT_USER \\ Software\\Classes\\  .ext

		MS HKEY_CLASSES_ROOT キー



	CDocManager::RegisterShellFileTypes での登録内容

		.ext
			@="---.Document"

		.ext\ShellNew
			"NullFile"=""


		---.Document
			@="---.Document"

		---.Document\DefaultIcon
			@="C:\---\---.exe,1"


		//	SDI

		---.Document\shell\open\command
			@="C:\---\---.exe \"%1\""

		---.Document\shell\print\command
			@="C:\---\---.exe /p \"%1\""

		---.Document\shell\printto\command
			@="C:\---\---.exe /pt \"%1\" \"%2\" \"%3\" \"%4\""


		//	MDI

		---.Document\shell\open\command
			@="C:\---\---.exe /dde"

		---.Document\shell\open\ddeexec
			@="[open(\"%1\")]"

		---.Document\shell\print\command
			@="C:\---\---.exe /dde"

		---.Document\shell\print\ddeexec
			@="[print(\"%1\")]"

		---.Document\shell\printto\command
			@="C:\---\---.exe /dde"

		---.Document\shell\printto\ddeexec
			@="[printto(\"%1\",\"%2\",\"%3\",\"%4\")]"




	シェル拡張		シェル拡張機能ハンドラーの作成

		.ext\ShellEx\{00021500-0000-0000-C000-000000000046}		//	ヒントハンドラ  	IQueryInfo
			@="{E5DF01A5-DA8F-4398-A99D-94A04B04CA2F}"			//	iShelExt.dll

		.ext\ShellEx\{BB2E617C-0920-11d1-9A0B-00C04FC2D6C1}		//	イメージハンドラ	IExtractImage
			@="{D28D515B-3377-418E-B866-6DADF18469B1}"			//	MShellE.dll




	Win10 などでドキュメントをダブルクリックしての関連付け

		\HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ext\OpenWithList
			"a"="firefox.exe"
			"b"="---.exe"
			"MRUList"="ab"

		\HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ext\OpenWithProgids
			"ext_auto_file"=hex(0):

		\HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ext\UserChoice
			"Hash"="L+hf9oR2C4c="
			"ProgId"="Applications\\firefox.exe"









2025/01/23

void CDocManager::RegisterShellFileTypes(BOOL bCompat)
{
	//	exe 名の取得
	AfxGetModuleShortFileName(AfxGetInstanceHandle(), strPathName);

	POSITION pos = m_templateList.GetHeadPosition();
	for (int nTemplateIndex = 1; pos != NULL; nTemplateIndex++)	{
		CDocTemplate* pTemplate = (CDocTemplate*)m_templateList.GetNext(pos);

		CString strOpen       CommandLine   = strPathName;
		CString strPrint      CommandLine   = strPathName;
		CString strPrintTo    CommandLine   = strPathName;
		CString strDefaultIconCommandLine   = strPathName;

		if (bCompat)	{
			CString strIconIndex;
			HICON hIcon = ::ExtractIcon(AfxGetInstanceHandle(), strPathName, nTemplateIndex);
			if (hIcon != NULL)	{
				strIconIndex.Format(_afxIconIndexFmt, nTemplateIndex);
				DestroyIcon(hIcon);
				}
			else	{
				strIconIndex.Format(_afxIconIndexFmt, DEFAULT_ICON_INDEX);
				}
			strDefaultIconCommandLine += strIconIndex;
			}

		CString strFilterExt, strFileTypeId, strFileTypeName;
		if (pTemplate->GetDocString(strFileTypeId,
		   CDocTemplate::regFileTypeId) && !strFileTypeId.IsEmpty())
		{
			// enough info to register it
			if (!pTemplate->GetDocString(strFileTypeName,
			   CDocTemplate::regFileTypeName))
				strFileTypeName = strFileTypeId;    // use id name

			ASSERT(strFileTypeId.Find(' ') == -1);  // no spaces allowed

			// first register the type ID of our server
			if (!_AfxSetRegKey(strFileTypeId, strFileTypeName))
				continue;       // just skip it									****	HKCR のためここで抜ける

			if (bCompat)	{													//		アイコンの登録
				// path\DefaultIcon = path,1
				strTemp.Format(_afxDefaultIconFmt, (LPCTSTR)strFileTypeId);
				if (!_AfxSetRegKey(strTemp, strDefaultIconCommandLine))
					continue;       // just skip it
				}

			//	...

			}

		}

	}


App.reg

REGEDIT
; This .REG file may be used by your SETUP program.
;   If a SETUP program is not available, the entries below will be
;   registered in your InitInstance automatically with a call to
;   CWinApp::RegisterShellFileTypes and COleObjectFactory::UpdateRegistryAll.

HKEY_CLASSES_ROOT\.mbp = MBPV.Document
HKEY_CLASSES_ROOT\MBPV.Document\shell\open\command = MBPV.EXE %1
HKEY_CLASSES_ROOT\MBPV.Document\shell\open\ddeexec = [open("%1")]
HKEY_CLASSES_ROOT\MBPV.Document\shell\open\ddeexec\application = MBPV
    ; note: the application is optional
    ;  (it defaults to the app name in "command")

HKEY_CLASSES_ROOT\MBPV.Document = MBPV Document