2012-06-26 3 views
1

하드웨어에서 정보를 읽는 Microsft PowerPoint 추가 기능 솔루션을 사용하고 있으며 하드웨어 개발자가이 하드웨어를 제어하기 위해 SDK를 제공했지만 문제를 제어하려고합니다.개체를 STA 스레드에서 사용한 후 어떻게 사용할 수 있습니까?

나는이 라이브러리를 가지고 클래스에게 있습니다 ARS

ARS.BaseConnection

나는이 변수를 가지고 ARS.BaseConnection BaseConn;

A가 나는 유형의 새 개체를 만들 때 문제는 BaseConnection

BaseConn = new ARS.BaseConnection(); 

디버거에 예외가 표시되지 않고 POWERPNT.exe가 충돌하고 중지됩니다.

POWERPNT를 디버그하려고했는데 위치가 0x00d20f78 인 액세스 위반 작성.하지만 파워 포인트를 프로그래밍하지는 않습니다.

ARS.BaseConnection BaseConn;` 

    public form1() 
    { 
     InitializeComponent(); 

     System.Threading.Thread thread = new System.Threading.Thread(createBase); 
     thread.SetApartmentState(System.Threading.ApartmentState.STA); 
     thread.Start(); 
     thread.Join(); 

     BaseConn.Open(); // There is the problem, when I'm trying to use open() BaseConn debuger says: COM object that has been separated from its underlying RCW cannot be used. 
    } 

    private void createBase() 
    { 
     BaseConn = new ARS.BaseConnection(); //If it runs in a STA tread doesn't crash. 
    } 

내가 가진 :

나는 SDK의 데모 프로그램 (즉, 실제로 작동)는이 [STAThread] 주 전에, 그래서 내가 새 스레드를 만들고 STA로 실행해야합니다 생각 가지고 세례반 기본 RCW에서 분리 된 COM 개체는 사용할 수 없습니다.

어떻게하면됩니까?

+0

게시 한 코드가 유효하지 않습니다. 스레드가 종료 된 후 개체가 죽었습니다. 이 사고를 추적하려면 공급 업체의 도움이 필요합니다. –

답변

0

해당 개체는 생성 스레드에서만 액세스 할 수 있습니다.

다른 스레드에서 개체에 액세스해야하는 경우 dispatcher을 사용하여 해당 스레드로 전환 할 수 있습니다.

메인 스레드에서 생성하는 것을 고려하십시오 (메인 스레드를 STA에 먼저 설정하십시오).

+1

문제는 메인 스레드가 아니라, PowerPoint Add-In입니다. public Form1 이전에 [STAThread]를 사용하려고 시도했지만 createBase()가 실행되기 전에 문제가 발생했는지는 알 수 없습니다. STA o STA로 변경되지 않습니다. – oscargilfc

+0

중단 점을 배치하고 현재 스레드가 STA인지 여부를 확인할 수 있습니까? (그리고 아마도 그것이 메인 쓰레드인지 아닌지). "windbg"과 "윈도우 용 디버깅 툴"을 사용하여 프로세스의 쓰레드를 검사 해보십시오. –

관련 문제