首先感谢在这方面研究过的前辈们!
express 和 outlook都能读
cpp前面要声明 #pragma link "Outlook_2K_SRVR" #pragma link "IvDictio" #pragma link "IvMulti" typedef HRESULT (WINAPI *fWABOpen)(LPADRBOOK*,LPWABOBJECT*,LPWAB_PARAM,DWORD);
用了bcb的outlook控件的 代码 try{ FormList->ListView1->Clear(); _ApplicationPtr pApp; _NameSpace* pNS; AddressLists* pAddr; AddressEntries * pAddrEntries; AddressEntry* pEntry; AddressList* pList; int count,count1; pApp = this->OutlookApplication1->get_Application(); pNS = pApp->GetNamespace(WideString("MAPI")); pAddr = pNS->AddressLists; count = pAddr->Count;
WideString email;
email.SetLength(128); //emailname.SetLength(128);
for(int i = 1;i <= count;i++) { pList = pAddr->Item(TVariant(i)); pAddrEntries = pList->get_AddressEntries(); count1 = pAddrEntries->Count; for(int j = 1;j <= count1;j++) { pEntry = pAddrEntries->Item(TVariant(j)); //pEntry->get_Name(&emailname); pEntry->get_Address(&email); //this->Memo1->Lines->Add(AnsiString(emailname.c_bstr()) + "\t" + AnsiString(email.c_bstr())); TListItem * ListItem; ListItem = FormList->ListView1->Items->Add(); ListItem->Caption = ""; ListItem->SubItems->Add(AnsiString(email.c_bstr()));
ListItem->Checked = true; }
} ListView1->SetFocus(); ListView1->Update(); } catch(...) { try{ HRESULT hRes; //LPADRBOOK lpAdrBook; DelphiInterface<IAddrBook> lpAdrBook; //LPWABOBJECT lpWABObject; DelphiInterface<IWABObject> lpWABObject; //LPWAB_PARAM lpWABParam = NULL; DWORD Reserved2 = NULL;
char szPath[MAX_PATH]; SHGetFolderPathX(szPath); char * s = "\\System\\wab32.dll"; strcat(szPath, s);
HINSTANCE hinstLib; hinstLib = LoadLibrary(szPath);
// hinstLib = LoadLibrary(s.c_str()+"\\System\\wab32.dll"); fWABOpen procWABOpen;
if (hinstLib != NULL) { // 获取"Wab32.dll"内部涵数WABOpen的进程地址 procWABOpen = (fWABOpen) GetProcAddress(hinstLib, "WABOpen");
if (procWABOpen != NULL) { hRes = (procWABOpen)(&lpAdrBook,&lpWABObject,NULL,Reserved2); //_ASSERTE(hRes == S_OK); if (hRes != S_OK) exit(1);
ULONG lpcbEntryID; ENTRYID *lpEntryID; hRes = lpAdrBook->GetPAB( &lpcbEntryID, &lpEntryID ); //_ASSERTE(hRes == S_OK); if (hRes != S_OK) exit(2);
ULONG ulFlags = MAPI_BEST_ACCESS; ULONG ulObjType = NULL; //LPUNKNOWN lpUnk = NULL; DelphiInterface<IABContainer> lpContainer; hRes = lpAdrBook->OpenEntry( lpcbEntryID, lpEntryID, NULL, ulFlags, &ulObjType, (LPUNKNOWN FAR *)&lpContainer );
ulFlags = NULL;
if (ulObjType == MAPI_ABCONT) {
//IABContainer *lpContainer = static_cast <IABContainer *>(lpUnk);
LPMAPITABLE lpTable = NULL; hRes = lpContainer->GetContentsTable( ulFlags, &lpTable ); //_ASSERT(lpTable); ULONG ulRows; hRes = lpTable->GetRowCount(0,&ulRows); //_ASSERTE(hRes == S_OK); SRowSet *lpRows;
hRes = lpTable->QueryRows( ulRows,// 获取所有行 0, &lpRows ); ListView1->Clear(); for(ULONG i=0;i<lpRows->cRows;i++) { SRow *lpRow = &lpRows->aRow[i]; AnsiString strTemp;
for(ULONG j=0;j<lpRow->cValues;j++) { SPropValue *lpProp = &lpRow->lpProps[j];
if (lpProp->ulPropTag == PR_EMAIL_ADDRESS_A) { TListItem * ListItem; ListItem = FormList->ListView1->Items->Add(); ListItem->Caption = ""; ListItem->SubItems->Add((char *)lpProp->Value.lpszA); //strTemp =(char *)lpProp->Value.lpszA;
ListItem->Checked = true; } } //ListEmail->Lines->Add(strTemp);
lpWABObject->FreeBuffer(lpRow); } lpWABObject->FreeBuffer(lpRows); } } //FreeLibrary(hinstLib);(装载和释放 dll 文件的地方改成在主程序执行之前装载,结束的时候释放) }
} catch(...) { MessageBox(Handle,"没有找到地址薄!","提示信息",MB_OK); } }

|