2016-11-29 6 views
0

IEnumString->Next()呼び出しが正しい関数を呼び出しても、クライアントのポインタをnullのままにする原因は何ですか?すべて64ビットです(Windows 10)。クライアントでCOM out-ptrがnullのままである

データフロー:私のDLL - >MSSpellCheckingHost - >クライアント

In my code (Github link)すべてがチェックアウトします。割り当てとコピーは上手く見えます。しかし、クライアントは、NULLポインタを見ているが、ISpellCheckProvider->Suggest();を経由して来たときにのみ、それはEnumString.hppからISpellCheckProviderFactory->get_SupportedLanguages()

スニペットを経由して正常に動作します:

template<typename String> 
inline void CoCopyWString(const String& in, PWSTR* out) { 
    debugp p(__FUNCTION__); 
    p(in, static_cast<void*>(*out)); 
    *out = reinterpret_cast<LPWSTR>(CoTaskMemAlloc(sizeof(wchar_t)*(in.size() + 1))); 
    std::copy(in.begin(), in.end(), *out); 
    (*out)[in.size()] = 0; 
    p(std::wstring(*out), static_cast<void*>(*out)); 
} 

class EnumString : public IEnumString { 
public: 
... 
    IFACEMETHODIMP Next(ULONG celt, LPOLESTR *rgelt, ULONG *pceltFetched) { 
     debugp p(__FUNCTION__); 
     p(celt); 
     HRESULT hr = S_FALSE; 

     ULONG i = 0; 
     for (; i < celt && current < strings.size(); ++i, ++current) { 
      p(i, current); 
      CoCopyWString(strings[current], rgelt+i); 
      p(static_cast<void*>(rgelt + i), static_cast<void*>(rgelt[i])); 
     } 

     if (celt > 1) { 
      *pceltFetched = i; 
     } 
     if (i == celt) { 
      hr = S_OK; 
     } 

     return hr; 
    } 
... 
private: 
    std::vector<std::wstring> strings; 
    ULONG current = 0; 
}; 

示すようMSSpellCheckingHostにデバッガをアタッチすることであるので、デバッグプリントがたくさんありますかなり迷惑は、彼らは例えばの予想出力収量:

EnumString::Next 
    1 
    0 0 
    CoCopyWString 
     i-llu 0000000000000000 
     i-llu 000001CC35682AE0 
    ~CoCopyWString 
    000001CC356A1F50 000001CC35682AE0 
~EnumString::Next 

...設定された出力ポインタを示し、データが正しいにある指摘しました。 SupportedLanguagesが呼び出されたときに動作します。これは、列挙子に正しい値を返し、値が使用されてnullにはならないようにします。しかし、Suggest()が使用された場合、結果は反映されません。

CoTaskMemAllocによって割り当てられた構造体を返す他のすべての関数も機能するため、ホスト全体が機能するように見えます。

+0

あなたは「クライアントのポインタはnullを残す」とはどういう意味ですかすべきですか?クライアントはポインタの配列にポインタを渡す必要があります。ポインタは 'Next'で埋められます。それがクライアントコードの機能ですか? –

+0

@ Cheersandhth.-Alf、yup、clientはMS独自のサンプルです。それは正しいものを渡しますが(wchar_t **になってしまいます)、 'Next'が返ってくるとnullのままです。私はMSSpellCheckingHostが利用可能なデバッグシンボルを持っていないので、パスをデバッグすることすらできません。私はアウトプットに何かビットをセットしてみると、私はそれを試してみることができるかどうかを見てみましたが、その1つの呼び出しでは何もしません。 –

+0

必ず* pceltFetchedを割り当てる必要があります。 0は「提案はありません」の正しい値です。 –

答えて

1

ハンスアンパッサンが指摘したように、スニペット

if (celt > 1) { 
     *pceltFetched = i; 
    } 

ではなく

if (pceltFetched) { 
     *pceltFetched = i; 
    } 
関連する問題