ホーム » 2022 » 5月 » 20

日別アーカイブ: 2022/05/20

2022年5月
1234567
891011121314
15161718192021
22232425262728
293031  

カテゴリー

アーカイブ

ブログ統計情報

  • 100,324 アクセス


MDI exe に lnk のドロップで開けない

MDI exe に lnk(ドキュメントへのショートカット)をドロップすると,
MDI exe に lnk をドロップ 「エラーはありませんでした。」
—————————
BLAM
—————————
エラーはありませんでした。
—————————
OK
—————————


ショートカット先のドキュメントファイルであれば開ける.
一度 GetOpenFileName などで ダイアログを開くと,その後は問題ない.


デバッガで追いかけると,AfxResolveShortcut でエラーになっている.


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

	if (!AfxOleInit()) {
		AfxMessageBox(_T("OLE の初期化に失敗しました。")) ;
		return	FALSE ;
		}

今回これを調べたのは,WM_DROPFILES の動作.
InitInstance で次の様にしている場合,CMainFrame::OnDropFiles で処理する.
m_pMainWnd->DragAcceptFiles();


MDI exe では,CView や CChildFrame で処理できそうだが,そのままでは呼ばれることはない.
予めそれぞれで DragAcceptFiles() が必要みたい.
例えば,次の様に CView で呼び出すと WM_DROPFILES が処理できる様になる.

void CBLAMView::OnInitialUpdate() 
{
	this->DragAcceptFiles();
//	...
	}
void CBLAMView::OnDropFiles(HDROP hDropInfo) 
{
	CView::OnDropFiles(hDropInfo);
	}

CMainFrame など以外の実装は Default() を呼出しているだけみたい.

_AFXWIN_INLINE void CWnd::OnDropFiles(HDROP)
	{ Default(); }

ビューのウィンドウ以外(グレーの部分)にドロップすると CMainFrame::OnDropFiles が呼ばれる.


C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30133\atlmfc\src\mfc\winfrm.cpp
void CFrameWnd::OnDropFiles(HDROP hDropInfo)
{
	SetActiveWindow();      // activate us first !
	UINT nFiles = ::DragQueryFile(hDropInfo, (UINT)-1, NULL, 0);

	CWinApp* pApp = AfxGetApp();
	ASSERT(pApp != NULL);
	for (UINT iFile = 0; iFile < nFiles; iFile++)
	{
		TCHAR szFileName[_MAX_PATH];
		::DragQueryFile(hDropInfo, iFile, szFileName, _MAX_PATH);
		pApp->OpenDocumentFile(szFileName);
	}
	::DragFinish(hDropInfo);
}

winfrm.cpp  CFrameWnd::OnDropFiles


CMainFrame で CDocument などを求める.
SDI の場合

CDocument*	pActiveDoc = GetActiveDocument() ;
CXxxView*	pView = (CXxxView*)GetActiveView() ;

MDI の場合は,GetActiveFrame() で CFrameWnd を求めてから.

CFrameWnd*	pActiveFrame = GetActiveFrame() ;

CDocument*	pActiveDoc = NULL ;
if (pActiveFrame != NULL) {
		pActiveDoc = pActiveFrame->GetActiveDocument() ;
		}

CXxxView*	pView = NULL ;
if (pActiveFrame != NULL) {
		pView = (CXxxView*)pActiveFrame->GetActiveView() ;
		}
Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.