2012-02-19 9 views
1

EDIT:私のATL COM dll、テストアプリケーション、オリジナルのC#dllのコードへのリンクが含まれています。これは複雑なプロジェクトなので、最も簡単な解決策です。自分で解決策を見つけることができなかったので、私はかなり切迫しています。誰が見てみたい場合はここで は、リンクです: https://docs.google.com/open?id=0B3ehFEncKJH7ZDgxMGI1YjgtZTE2MS00ZTBkLWI2NzgtYzVhZjUxOWEzZGI0ATL COM DLLはC#で動作しますが、C++では動作しません。

私はATLを使用してDLLを作成し、それは私が与えられたテストプログラムで動作するように取得しようとしていました。これが修正されたので、DLLにアクセスする方法を変更したくありません。以前のC#バージョンでdllをベースにして、ProgIDとUUIDを同じに保つようにしました。

いずれかの方法を使用しようとすると、バッファオーバーランに問題が発生しています。しかし、私は別の問題に遭遇し、なぜそれが起こっているのか分かりません。私のdllが動作していることを確認するために、私はメソッドの1つにsleep文を追加しました。私がテストプログラムからこのメソッドを呼び出すと、管理されていないC++で書かれていますが、スリープ機能は動作していません。しかし、私はC#アプリケーションを作成し、参照として私のDLLを追加し、それが動作するメソッドを呼び出す場合。なぜこのようなことが起こるのか誰にも分かりますか?

編集: 私はそれがどのように使用されているかについていくつかの詳細を含めるべきだと思った。テスト用のC++アプリケーションは、次のようにオブジェクトのインスタンスを作成し、インスタンス化します。

IUserIDAPtr m_pUserIDA; 
::CoInitialize(m_pUserIDA); 
m_pUserIDA.CreateInstance(_T("Analyst_UserIDA.UserIDAObject")); 

if (m_pUserIDA != NULL) 
{ 
    cout << "Aww yeah, that point isn't null" << endl; 
    m_pUserIDA->AddRef(); 


    HRESULT result = m_pUserIDA->OnInitIDA(); 

現在、スリープ機能はOnInitIDAにあります。 C#を使用する場合

は、私は、DLLへの参照を追加し、これをした:
 UserIDAObject IDAObject = new UserIDAObject(); 
     IDAObject.OnInitIDA(); 
     short minCharge = 0; 
     short maxCharge = 0; 
     bool doChargeState = false; 
     IDAObject.GetChargeStateParam(ref minCharge, ref maxCharge, ref doChargeState); 

私は、バッファオーバーランを取得するC++アプリケーションでGetChargeStatParamを使用しようとするが、これは、C#のバージョンでは発生しません

。しかし、私は逃げます... この場合、C#アプリケーションは10秒間スリープ状態になります。

なぜそれが動作しないのかを理解するために探し始める場所はわかりません。

EDIT:これは、DLLで定義されているインタフェースです。

STDMETHOD(GetSwitchCriteria)(DOUBLE* intensity, DOUBLE* minMass, DOUBLE* maxMass, BOOL* selectIntensity, LONG* numOfDepCycles); 
STDMETHOD(GetChargeStateParam)(SHORT* minCharge, SHORT* maxCharge, BOOL* doChargeState); 
STDMETHOD(GetInclusionList)(DOUBLE* intensity, DOUBLE* theList, SHORT* numOfItems); 
STDMETHOD(GetExclusionList)(LONG* exRTWindow, DOUBLE* theMassList, LONG* theRTList, SHORT* numOfItems); 
STDMETHOD(GetOtherCriteria)(LONG* smartFilterTime, DOUBLE* isoExclusionWin, DOUBLE* massTolerance, BOOL* isPPM); 
STDMETHOD(GetIsotopeMatchParam)(DOUBLE* theMassList, DOUBLE* theAbundanceList, DOUBLE* abTolerance, DOUBLE* maTolerance); 
STDMETHOD(OnInitIDA)(void); 
STDMETHOD(OnScreenSurveySpec)(void); 
STDMETHOD(OnPrepareNextScan)(DOUBLE* selectedMasses, DOUBLE* selectedIntensities, LONG* selectedCharges, LONG itemCount); 

これはOnInitIDA

STDMETHODIMP CUserIDA::OnInitIDA(void) 
{ 
// TODO: Add your implementation code here 
Sleep(5000); 
return S_OK; 
} 

の実装です私はUserIDAが私のDLLで定義されているかを心配するべき?同じメソッドを持っていた私の以前のC#dllは、このテストアプリケーションで正常に動作しました。

EDIT: 不思議なことに、私はそれが私を困惑かかわらず、誰かのアイデアを与えるかもしれないいくつかのかなり奇妙な行動を発見しました。私はVS2008の "ステップイン"機能を使用し、OnInitIDAが呼び出されたときに、別のメソッドGetInclusionListに実際に入ることがわかりました。私はこのメソッドにいくつかのコードを置く場合、それは実行されます。私はまた、なぜこのような現象が実際に起こっているのか分かりませんが、この種の動作がバッファオーバーランを引き起こす可能性があると考えています。

+0

'CreateInstance'から得たポインタを' AddRef'する必要はありません。 –

+1

あなたの編集に基づいて、あなたのVTABLEがうんざりしていると言いたいと思います。おそらく、C++対C#側のIDAObjectインターフェイスの異なる唯一の理由が考えられます。 – dkackman

答えて

0

難しいと言えます。 OnInitIDAのコードを投稿したいかもしれません。

CoInitializeには何も渡さないでください:

あなたがまたは関連してもしなくてもよいのバグを持っています。MSDNから:

パラメータ

pvReserved [in, optional] 

このパラメータは予約されており、NULLでなければなりません。

+0

私はそれを見ることができます、私はそれらの間違いが私のやり方ではないので私は元のテストアプリケーションを作成しませんでしたが、私はまだかなりWindowsプログラミングに新しいとそれらをキャッチしていないだろう。私はいくつかのコードを投稿します。しかし、今はOnInitIDAは基本的に空であり、スリープを呼び出すだけです。 – Travis

+0

私はそれを変更しようとしましたが、それを実行するたびにバッファオーバーランが発生しました。私は、このDLLのC#版を作成したときに、テストアプリケーションが正常に動作していたことに注意してください。このATLプロジェクトの私の目標は、dllを正確に複製し、同じコードで呼び出すことができるcom dllを作成することでした。 – Travis

+0

あなたはsleep文でブレークポイントに達することさえできますか?あなたが今までに提示したものに基づいて、あなたのプロジェクトに何か問題があるように思えます。それはウィザードで作成されたATLのexeファイルですか? – dkackman

関連する問題