On 5/23/2010 05:09, Hirofumi Katayama wrote:
See attachment.
Hi, some comments here.

+/****************************************************************************/
+
+static const WCHAR szMRUList[] = L"MRUList";
+static const WCHAR szRunMRU[] =
+    L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\RunMRU";
+
Don't use this L"" specifier for strings, use array initialization style instead.

+void *my_malloc(UINT size)
+{
+    return HeapAlloc(GetProcessHeap(), 0, size);
+}
+
+void *my_realloc(void *p, UINT size)
+{
+    if (p == NULL)
+        return my_malloc(size);
+    return HeapReAlloc(GetProcessHeap(), 0, p, size);
+}
+
+void my_free(void *p)
+{
+    HeapFree(GetProcessHeap(), 0, p);
+}
+
This isn't very useful, I think it's not a pain to use direct calls for this file.
+#define malloc my_malloc
+#define realloc my_realloc
+#define free my_free
+#define _wcsdup my__wcsdup
Don't do that.
+
+STDMETHODIMP IEnumString_fnQueryInterface(IEnumString *pEnumString, REFIID 
riid, void** ppvObject);
+STDMETHODIMP_(ULONG) IEnumString_fnAddRef(IEnumString *pEnumString);
+STDMETHODIMP_(ULONG) IEnumString_fnRelease(IEnumString *pEnumString);
+STDMETHODIMP IEnumString_fnNext(IEnumString *pEnumString, ULONG celt, LPOLESTR 
*rgelt, ULONG *pceltFetched);
+STDMETHODIMP IEnumString_fnSkip(IEnumString *pEnumString, ULONG celt);
+STDMETHODIMP IEnumString_fnReset(IEnumString *pEnumString);
+STDMETHODIMP IEnumString_fnClone(IEnumString *pEnumString, IEnumString 
**ppenum);
STDMETHODIMP isn't used in Wine code, use explicit WINAPI please. Also forward declaration for methods isn't used, usually a vtable is
initialized just after all methods bodies.

+typedef struct
+{
+    IEnumStringVtbl *lpVtbl;
+    LONG        m_lRef;
+    IMalloc *   m_pMalloc;
+    INT         m_i;
+    INT         m_c;
+    LPWSTR *    m_strings;
+} EnumStringImpl;
Please avoid this MFC style like m_* for members, and use more descriptive names.

+EnumStringImpl *IEnumString_construct(VOID)
+{
+    EnumStringImpl *pEnumString;
+
+    pEnumString = (EnumStringImpl *) malloc(sizeof(EnumStringImpl));
+    if (pEnumString != NULL)
+    {
+        pEnumString->lpVtbl =&EnumStringVtbl;
+        pEnumString->m_lRef = 0;
+        pEnumString->m_pMalloc = NULL;
+        SHGetMalloc(&pEnumString->m_pMalloc);
+        pEnumString->m_i = 0;
+        pEnumString->m_strings = GetMRUStrings(&pEnumString->m_c);
+    }
+    return pEnumString;
+}
This is wrong. Initial refcount should be 1.
+EnumStringImpl *IEnumString_construct(VOID)
+
+VOID IEnumString_destruct(EnumStringImpl *pEnumString)
Should be static both, and methods too of course.

+        pEnumString->lpVtbl->AddRef(pEnumString);
No need for that, use defined macros to call methods from vtables.
+STDMETHODIMP_(ULONG) IEnumString_fnAddRef(IEnumString *pEnumString)
+{
+    EnumStringImpl *this = (EnumStringImpl *) pEnumString;
+    this->m_lRef++;
+    return (ULONG) this->m_lRef;
+}
You should use interlocked increment here (same for _Release()).

+    pProp->fnOldWndProc = (WNDPROC) SetWindowLongPtr(hwndEdit, GWLP_WNDPROC, 
(LONG_PTR) AutoCompleteEditWndProc);
Did you ever build it? I think we have a blocking things for using implicit A/W calls.









Reply via email to