使用IEnumString完成自定义源代码

IAutoComplete custom source with IEnumString

本文关键字:自定义 源代码 IEnumString 使用      更新时间:2023-10-16

我正在尝试为组合框(win32, c++)或编辑控件实现自动建议。但我不知道如何使用界面IAutoComplete正确。我需要一个自定义的字符串列表,其中匹配的自动建议应该采取的。但是如何实现这个IEnumString?我找到了这个链接,但它并没有揭示一切:http://msdn.microsoft.com/en-us/library/windows/desktop/hh127437%28v=vs.85%29.aspx

有人实现过这个吗?提前感谢迈克尔。

正如我在评论中指出的,ATL已经为您预先写好了一个。

typedef CComEnum<IEnumString,
                 &IID_IEnumString,
                 LPOLESTR,
                 _Copy<LPOLESTR> > CComEnumString;
CComObject<CComEnumString> *pes;
HRESULT hr = CComObject<CComEnumString>::CreateInstance(&pes);

这些代码基本上是从CComEnum文档中偷来的。

好的,在所有答案的帮助下,我到目前为止得到了它:

            IAutoComplete *pac;
        HRESULT hr = CoCreateInstance(CLSID_AutoComplete, 
                                        NULL, 
                                      CLSCTX_INPROC_SERVER,
                                      IID_PPV_ARGS(&pac));
        typedef CComEnum<IEnumString,
             &IID_IEnumString,
             LPOLESTR,
             _Copy<LPOLESTR> > CComEnumString;
        CComObject<CComEnumString> *pes;
        HRESULT hRes = CComObject<CComEnumString>::CreateInstance(&pes);
        // hRes = pes->Init(
        IUnknown* pUnk;
        hRes = pes->QueryInterface(IID_IEnumString, (void**) &pUnk);
        pac->Init(hEdit, pUnk, NULL, NULL);
        // maybe we release ?
        pUnk->Release();
        IAutoComplete2 *pac2;
        if (SUCCEEDED(pac->QueryInterface(IID_IAutoComplete2, (LPVOID*)&pac2)))
        {
            pac2->SetOptions(ACO_AUTOSUGGEST);
            pac2->Release();
        }

只剩下一件事:

CComObject *类型的初始化。假设我有一个这样的数组:

std::string myArray[] = { string("abc"), string("foo"), string("muh") };

现在我想把这些字符串填充到pes->Init(…)方法中。这里是如何转换到LPOLESTR的呢?Init(…)方法有一个指向数组开始和结束的指针。结束应该是在最后一个数组元素之后的一个位置,所以这里是myArray[3]吗?我只是问,因为我认为这在这个数组中是越界的?

非常感谢!