// cl tst-getcontacts.cpp include\SCM3A_i.c -I include ole32.lib oleaut32.lib
// 

#define _WIN32_DCOM 1
#define _WIN32_WINNT 0x0500

#include <windows.h>
#include <ObjBase.h>
#include <Unknwn.h>
#include <stdio.h>

#include "scm3a.h"

int main()
{
    HRESULT hr= CoInitializeEx(0,COINIT_MULTITHREADED);
    if (hr) {
        printf("CoInitializeEx: %08lx\n", hr);
        return 1;
    }

    IUnknown *pu=NULL;
    hr= CoCreateInstance(CLSID_PhonebookSuite3, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (void**)&pu);
    if (hr) {
        printf("CoCreateInstance: %08lx\n", hr);
        CoUninitialize();
        return 1;
    }
    printf("pu=%08lx : %08lx[%08lx %08lx] %08lx\n", pu, ((DWORD*)pu)[0], ((DWORD**)pu)[0][0], ((DWORD**)pu)[0][1], ((DWORD*)pu)[1]);
    IPhonebook3 *pb3=NULL;
    hr = pu->QueryInterface(IID_IPhonebook3, (void**)&pb3);
    if (hr) {
        printf("pu->QueryInterface: %08lx\n", hr);
        CoUninitialize();
        return 1;
    }
    printf("pb3=%08lx\n", pb3);
    IContact2 *ct2=NULL;
    for (long i=1 ; i<0x10 ; i++)
    {
        hr = pb3->GetContact(MODE_ABSOLUTE, KEY_LOCATION, PHYS_MEM_ALL, LOG_MEM_ALL, &i, NULL, &ct2);
        if (hr) {
            printf("IPhonebook::GetContact(%d): %08lx\n", i, hr);
        }
        else {
            long nflds= 0;
            HRESULT hrc= ct2->get_AmountOfFields(&nflds);
            if (hrc) {
                printf("IContact::AmountOfFields: %08lx\n", hrc);
                break;
            }
            printf("%d: %4d", i, nflds);
            for (long j=0 ; j<nflds ; j++) {
                HRESULT hrf= ct2->put_FieldIndex(j);
                if (hrf) {
                    printf("ct2->FieldIndex(%d): %08lx\n", j, hrf);
                    break;
                }
                FieldType ft;
                hrf= ct2->get_ValueType(&ft);
                if (hrf) {
                    printf("ct2->ValueType: %08lx\n", hrf);
                    break;
                }
                printf(" %4d", ft);
                BSTR name;
                hrf= ct2->get_StringValue(&name);
                if (hrf) {
                    printf("ct2->StringValue: %08lx\n", hrf);
                    break;
                }
                printf(" %ls\n", *name);
            }
        }
    }
    CoUninitialize();
    return 0;
}
