2010-06-26 4 views
2

Outlook에서 기존 메일 메시지를 여는 응용 프로그램을 구축하고 있습니다. 사용자가 이미 Outlook을 실행하고 있거나하지 않을 수 있습니다. Outlook이 실행되고 있지 않으면 모두 제대로 작동하지만 이미 실행중인 경우 COM 오류 (80080005)가 표시됩니다. 인터넷은 기존 Outlook 프로세스가 바인드하려고하는 응용 프로그램보다 높은 권한 수준으로 실행되고있는 경우 이러한 상황이 발생할 수 있음을 나타냅니다.기존 Outlook 프로세스에 연결

메시지를 여는 데 Outlook에 다른 방법이 있습니까? 아니면 권한 수준과 일치하는지 확인해야합니까?

감사합니다,

-Patrick

편집 스택 오버플로가 의견 의미있는 형식을 허용하지 않는 한, 원래의 질문에 코드를 추가.

var outlook = new Outlook.Application(); 

그 라인은 내가 내 응용 프로그램을 시작하기 전에 Outlook을 발사 한 경우를 제외하고 모든 경우에 작동합니다

원래는 다음을 수행했다. 이 경우 앞에서 설명한 80080005 오류 코드가 표시됩니다.

나는이로 변경했습니다 좀 더 COM 노골적인 :

Application outlook; 
try 
{ 
    outlook = (Application)Marshal.GetActiveObject("Outlook.Application"); 
} 
catch (COMException ex) 
{ 
    if (ex.ErrorCode == -2147221021) 
     outlook = new ApplicationClass(); 
    else 
     throw; 
} 

그러나, 그 코드는 여전히 꽤 작업을 수행합니다 - 아웃룩 누구의 ErrorCode가 0x800401E3 (인 예외를, 내가 트랩을 실행하는 경우 MK_E_UNAVAILABLE). 그러나 새로운 ApplicationClass 객체를 만들려고해도 여전히 동일한 80080005 오류 코드가 발생합니다.

나는 또한 대신 new ApplicationClass() 라인의 catch 블록에 다음 퍼팅 시도했지만,이 행동에 차이 없습니다

:

outlook = (Application) Activator.CreateInstance(
    Type.GetTypeFromProgID("Outlook.Application")); 

답변

2

문제의 원인은 디버거였습니다. Visual Studio의 디버거에서 Word를 시작했습니다. 정상 경로를 통해 Word를 시작하면 80080005 코드가 사라집니다.

- 패트릭

0

내가 추측하고있어 코드를 보지 않고,하지만 당신처럼 소리 전화는 CreateObject()입니다. Outlook이 이미 실행중인 경우 GetObject()으로 전화해야합니다.

먼저 GetObject을 사용하여 Outlook이 이미 실행 중인지 확인하십시오 ( 오류를 catch해야 함).

+0

저는 C# interop lib 호출 (new Application() 등)을 사용하고 있습니다. GetObject() 포인터에 감사드립니다. –

+1

Outlook은 GetObject ("", "Outlook.Application")가 아직 실행 중이 아니며 오류를 반환하지 않을 경우 세션을 시작한다는 점에서 다소 이상합니다. – Fionnuala

+0

@Remou : 나는 그것을 몰랐다. 좋은 정보, 고마워. –

관련 문제