2017-09-29 12 views
0

スレッドのAPIメソッドで配列を使用する際に問題があります。
アレイのロックが機能しませんでした。ロック配列Com例外

Thread thrCreate = new Thread(createThread); 
thrCreate.SetApartmentState(ApartmentState.STA); 
thrCreate.Start(); 

private void createThread() 
{ 
    IEdmAddCustomRefs2 pdmRefs = (IEdmAddCustomRefs2)vault2.CreateUtility(EdmUtility.EdmUtil_AddCustomRefs); 

    IEdmFile5 pdmRefFile = (IEdmFile5)pdmResult;   

    int[] iRefCount = new int[1]; 
    iRefCount[0] = 1; 

    string[] strRefPath = new string[1]; 
    strRefPath[0] = strPDFPath + strSerName + ".pdf"; 

    lock (strRefPath) 
    { 
     lock (iRefCount) 
     { 
      pdmRefs.AddReferencesPath2(pdmRefFile.ID, ref strRefPath, ref iRefCount); 
     } 
    } 
} 

COM例外はDISP_E_ARRAYISLOCKEDと呼ばれます。

+2

'lock'声明ここでは助けにはなりません。ここで

は、更新されたコードです。 HRESULTの名前で参照されるロックは、バリアントに含まれるCOM配列のロックです。 – Richard

+1

このエラーは基本的に、ワーカースレッドでこのコードを実行することは良い考えではないことを示しています。 SolidWorksに可能なことを尋ねる必要がありますが、期待される応答は「しないでください」です。 –

+0

'IEdmAddCustomRefs2'の実装の中には安全な配列があり、[' SafeArrayLock'](https://msdn.microsoft.com/en-us/library/windows/desktop/ms221492(v = vs.85) ).aspx)が['SafeArrayUnlock'](https://msdn.microsoft.com/en-us/library/windows/desktop/ms221246(v = vs.85).aspx)の呼び出しを超えています) – Richard

答えて

0

私は今AddReferencesメソッドを使用していますが、私はもう例外を取得していません。

Thread thrCreate = new Thread(createThread); 
thrCreate.SetApartmentState(ApartmentState.STA); 
thrCreate.Start(); 

private void createThread() 
{ 
    IEdmAddCustomRefs2 pdmRefs = (IEdmAddCustomRefs2)vault2.CreateUtility(EdmUtility.EdmUtil_AddCustomRefs); 

    IEdmFile5 pdmRefFile = (IEdmFile5)pdmResult;   

    string[] strRefPath = new string[1]; 
    strRefPath[0] = strPDFPath + strSerName + ".pdf"; 

    pdmRefs.AddReferencesPath(pdmRefFile.ID, ref strRefPath); 
} 
関連する問題