					else if(msg.wParam == VK_RETURN){
						// RETURN = OK
						if(!bCtrl){
							msg.hwnd    = hOwner;
							msg.message = WM_COMMAND;
							msg.wParam  = IDOK;
						}
					}
					else if(msg.wParam == VK_ESCAPE){
						// ESCAPE = CANCEL
						HWND hCapture = ::GetCapture();
						if(!hCapture){
							// Lv`[łȂ
							if(!bCtrl){
								msg.hwnd    = hOwner;
								msg.message = WM_COMMAND;
								msg.wParam  = IDCANCEL;
							}
						}
						else{
							// Lv`[ȂLv`[LẐ
							::ReleaseCapture();
							bTranslated = true;
						}
					}



			// t@CI
			int cnt = 0;
			LPCSTR p = szPathName;
			while(*p){
				cnt++;
				while(*p++);
			}
			SAFEARRAY* pArray = SafeArrayCreateVector(VT_VARIANT,0,cnt);
			VARIANT* pvars;
			if(SafeArrayAccessData(pArray,(void**)&pvars) == S_OK){
				cnt = 0;
				p = szPathName;
				WCHAR wbuf[MAX_PATH];
				while(*p){
					MultiByteToWideChar(GetACP(),0,p,-1,wbuf,MAX_PATH);
					VariantInit(&pvars[cnt]);
					pvars[cnt].vt = VT_BSTR;
					pvars[cnt].bstrVal = SysAllocString(wbuf);
					while(*p++);
					cnt++;
				}
				SafeArrayUnaccessData(pArray);
			}
			pArray->fFeatures |= FADF_HAVEVARTYPE;
			pvarReturn->vt     = VT_ARRAY | VT_VARIANT;
			pvarReturn->parray = pArray;
		}



	DWORD retWait = WAIT_OBJECT_0;
	HWND hDlg[33] = { NULL };
	hDlg[0] = m_hPopupWnd;

	// Cxgҋ@
	if(varObj.vt == VT_ERROR || varObj.vt == VT_NULL || varObj.vt == VT_EMPTY){
		// Ȃ = ̃IuWFNg̃Cxgҋ@
		HANDLE hEvent[1];
		hEvent[0] = m_hWaitEvent;
		retWait = MsgWaitForMultipleObjects(1,hEvent,false,sleeptim,QS_ALLEVENTS|QS_ALLINPUT);
	}
	else{
		// PƂ̃C^[tFCXǂ?
		CComVariant varArg;
		if(varArg.ChangeType(VT_UNKNOWN,&varObj) == S_OK){
			IUnknown* pUnk = varArg.punkVal;
			IOverlappedWindow* piPopupWnd = NULL;
			if(pUnk->QueryInterface(IID_IOverlappedWindow,(void**)&piPopupWnd) == S_OK){
				HANDLE hEvent[2];
				hEvent[0] = m_hWaitEvent;
				piPopupWnd->_GetInternalWaitEventHandle((LONG*)&hEvent[1]);
				piPopupWnd->get_HWND((LONG*)&hDlg[1]);
				piPopupWnd->Release();
				//
				retWait = MsgWaitForMultipleObjects(2,hEvent,false,sleeptim,QS_ALLEVENTS|QS_ALLINPUT);
			}
			else{
				ErrorInfo(IDS_ERR_ANTHERINTERFACE);
				return DISP_E_EXCEPTION;
			}
		}
		else{
			// z񂪂Ƃ`FbN
			BOOL err = true;
			if(varObj.vt & (VT_BYREF|VT_VARIANT)){
				// oAg^̎QƓnł?
				varArg = *varObj.pvarVal;
			}
			else if(varObj.vt & VT_ARRAY){
				// z^ł
				varArg = varObj;
			}
			//
			if(varArg.vt & VT_ARRAY){
				// z̉͊Jn
				SAFEARRAY* pArray = NULL;
				if(varArg.vt & VT_BYREF){
					// z̎Q
					pArray = *varArg.pparray;
				}
				else{
					// z񂻂̂́B
					pArray = varArg.parray;
				}
				VARTYPE vt = VT_EMPTY;
				SafeArrayGetVartype(pArray,&vt);
				long lb = 0;
				long ub = 0;
				int dm = SafeArrayGetDim(pArray);
				SafeArrayGetLBound(pArray,1,&lb);
				SafeArrayGetUBound(pArray,1,&ub);
				if(dm == 1 && lb == 0 && ub > lb && ub < 32){
					// z̎A͈͂LłB
					err = false;
					HANDLE hEvent[32] = { NULL };
					int cnt;
					long idx[1];
					if(vt == VT_VARIANT){
						// VARIANT̔zł
						for(cnt = 0 ; cnt < ub ; cnt++ ){
							idx[0] = cnt;
							VARIANT tmp;
							if(SafeArrayGetElement(pArray,idx,&tmp) == S_OK){
								if(tmp.vt & VT_UNKNOWN){
									IUnknown* pUnk = NULL;
									if(tmp.vt & VT_BYREF){
										pUnk = *tmp.ppunkVal;
									}
									else{
										pUnk = tmp.punkVal;
									}
									IOverlappedWindow* piPopupWnd = NULL;
									if(pUnk->QueryInterface(IID_IOverlappedWindow,(void**)&piPopupWnd) == S_OK){
										piPopupWnd->_GetInternalWaitEventHandle((LONG*)&hEvent[cnt]);
										piPopupWnd->get_HWND((LONG*)&hDlg[cnt+1]);
										piPopupWnd->Release();
									}
								}
								else{
									// IUnknownȊO͏łȂB
									err = true;
								}
								VariantClear(&tmp);
							}
						}
					}
					else if(vt == VT_UNKNOWN){
						// IUnknown̔zł
						for(cnt = 0 ; cnt < ub ; cnt++ ){
							idx[0] = cnt;
							IUnknown* pUnk = NULL;
							if(SafeArrayGetElement(pArray,idx,&pUnk) == S_OK){
								IOverlappedWindow* piPopupWnd = NULL;
								if(pUnk->QueryInterface(IID_IOverlappedWindow,(void**)&piPopupWnd) == S_OK){
									piPopupWnd->_GetInternalWaitEventHandle((LONG*)&hEvent[cnt]);
									piPopupWnd->get_HWND((LONG*)&hDlg[cnt+1]);
									piPopupWnd->Release();
								}
							}
						}
					}//endif(z擾)
					if(!err){
						// Cxgnhz񂪂܂擾΃Cxg҂
						retWait = MsgWaitForMultipleObjects(ub,hEvent,false,sleeptim,QS_ALLEVENTS|QS_ALLINPUT);
					}
				}//endif(z͈̓`FbN)
			}
			if(err){
				// ꂪȂ񂾂ȂB
				ErrorInfo(IDS_ERR_NEEDINTERFACES);
				return DISP_E_EXCEPTION;
			}
		}
	}

	if(retWait != WAIT_TIMEOUT){
		// CxgtrueԂ
		*pRet = -1;
		// bZ[W[v݂
		MSG msg;
		while(PeekMessage(&msg, NULL, 0, 0,PM_REMOVE)){
			int i;
			BOOL bTranslated = false;
			if(msg.hwnd){
				// bZ[WEBhEɑ΂ă_CAOs
				BOOL bChallenged = false;
				for(i=0 ; i<33 && hDlg[i] && !bChallenged ; i++){
					HWND hParent = msg.hwnd;
					while(hParent = ::GetParent(hParent)){
						if(hParent == hDlg[i]){
							bTranslated = ::IsDialogMessage(hDlg[i],&msg);
							bChallenged = true;
							break;
						}
					}
				}
			}
			if(!bTranslated){
				::TranslateMessage( &msg );
				::DispatchMessage( &msg );
			}
		}
	}
