社本@元ネオニート Blog

社本@元ネオニート (元々ワック) のいたずら書き (for Programmers)

AILight Banner
AILight Blog

プロフィール

社本@元ネオニート Blog
働いたら負けかなと思っていたのですが。。とうとう働き始めました。アメリカのシアトル・エリアにある企業向けのバックアップソフトを開発している会社です。日本人は私だけ。なんとか。。やっていけてるようです。

目次

Blog 利用状況

記事分類

過去の記事

タグ

WAB API が廃止された? - Windows Vista

以下のような質問メールが、Blog 経由できました。
(公開は、本人の承諾を得ております)

> はじめまして、検索でたどりつきました。
> 直接Blogにコメントするか迷ったのですが、
> こちら(メールフォーム)から質問することにします。
>
> 社本さんの06/12/05のWindows Contacts の記事を見ました。
> 確かにいろいろ検索しても、Windows Contacts のサンプルは
> (日本語では)見かけることができなかったので、非常に参考になります。
>
> 私は WinXP+VC6.0 でWABを開いて、そのWABからメアドを
> 取得するPGMを作っていますが、Vistaでは開く際にエラーにな
> ります。

06/12/05 の記事にも書いていますが、Windows Vita では
Windows Address Book (WAB) に代わり Windows Contacts が
アドレス帳の管理を行うようになりました。

しかし、互換性を考えるとAPIの廃止はしないではないかと
予想していたので、エラーになるというのは意外でした。
そこで、確認のために以下のようなコードを書いてみました。

---
 HRESULT TestWab()
 {
  USES_CONVERSION;

  HRESULT hr = S_OK;

  CModule module;

  // DLLのキャッシュ
  CString strFileName = CWabHelper::GetWABDllPath();
  HINSTANCE hInst = module.LoadLibrary(strFileName);
  if (hInst == NULL)
  {
   return E_FAIL;
  }

  IAddrBookPtr spAddrBook;
  IWABObjectPtr spWABObject;
  CWabParam wabParam(m_hWnd);
  hr = thisClass::Probe_WABOpen(&spAddrBook, &spWABObject, &wabParam, 0);
  if (FAILED(hr))
  {
   return hr;
  }

  ULONG cbEntryID = 0;
  LPENTRYID lpEntryID = NULL;
  hr = spAddrBook->GetPAB(&cbEntryID, &lpEntryID);
  if (FAILED(hr))
  {
   return hr;
  }

  ULONG ulObjType= 0;
  IABContainerPtr spABContainer;
  hr = spAddrBook->OpenEntry(cbEntryID, lpEntryID, NULL, 0, &ulObjType, (LPUNKNOWN*)&spABContainer);
  if (FAILED(hr))
  {
   // 無視する。。
  }

  thisClass::FreeBuffer(lpEntryID, spWABObject);

  IMAPITablePtr spMAPITable;
  hr = spABContainer->GetContentsTable(WAB_LOCAL_CONTAINERS, &spMAPITable);
  if (FAILED(hr))
  {
   return hr;
  }

  hr = spMAPITable->SeekRow(BOOKMARK_BEGINNING, 0, NULL);
  if (FAILED(hr))
  {
   return hr;
  }

  ULONG ulCount = 0;
  hr = spMAPITable->GetRowCount(0, &ulCount);
  if (FAILED(hr))
  {
   return hr;
  }

  for (ULONG i = 0; i QueryRows(1, 0, &lpSRowSet);
   if (FAILED(hr))
   {
    ATLASSERT(0);
    continue;
   }

   // 省略。。

   thisClass::FreeBuffer(lpSRowSet, spWABObject);
  }

  return S_OK;
 }

 template <typename T>
 static HRESULT FreeBuffer(T* p, IWABObjectPtr spWABObject)
 {
  ATLASSERT(spWABObject != NULL);
  if (p == NULL)
  {
   return S_FALSE;
  }

  HRESULT hr = S_OK;

  hr = spWABObject->FreeBuffer(p);
  if (FAILED(hr))
  {
   // 無視する。。
  }

  return S_OK;
 }
 static HRESULT FreeBuffer(LPSRowSet lpSRowSet, IWABObjectPtr spWABObject)
 {
  ATLASSERT(spWABObject != NULL);
  if (lpSRowSet == NULL)
  {
   return S_FALSE;
  }

  HRESULT hr = S_OK;

  for (ULONG i = 0; i cRows; ++i)
  {
   const SRow& SRow = lpSRowSet->aRow[i];

   hr = spWABObject->FreeBuffer(SRow.lpProps);
   if (FAILED(hr))
   {
    // 無視する。。
    continue;
   }
  }

  hr = spWABObject->FreeBuffer(lpSRowSet);
  if (FAILED(hr))
  {
   // 無視する。。
  }

  return S_OK;
 }

 static HRESULT Probe_WABOpen(
  LPADRBOOK *lppAdrBook,
  LPWABOBJECT *lppWABObject,
  LPWAB_PARAM lpWABParam = NULL,
  DWORD Reserved2 = 0)
 {
  HRESULT hr = S_OK;

  CModule module;

  CString strFileName = thisClass::GetWABDllPath();
  HINSTANCE hInst = module.LoadLibrary(strFileName);
  if (hInst == NULL)
  {
   return E_FAIL;
  }

  CString strProcName = _T("WABOpen");
  LPWABOPEN func = (LPWABOPEN)module.GetProcAddress(strProcName);
  if (func == NULL)
  {
   return E_NOTIMPL;
  }

  return func(lppAdrBook, lppWABObject, lpWABParam, Reserved2);
 }
 static HRESULT Probe_WABOpenEx(
  LPADRBOOK *lppAdrBook,
  LPWABOBJECT *lppWABObject,
  LPWAB_PARAM lpWABParam,
  DWORD Reserved2,
  ALLOCATEBUFFER *lpfnAllocateBuffer,
  ALLOCATEMORE *lpfnAllocateMore,
  FREEBUFFER *lpfnFreeBuffer)
 {
  HRESULT hr = S_OK;

  CModule module;

  CString strFileName = thisClass::GetWABDllPath();
  HINSTANCE hInst = module.LoadLibrary(strFileName);
  if (hInst == NULL)
  {
   return E_FAIL;
  }

  CString strProcName = _T("WABOpenEx");
  LPWABOPENEX func = (LPWABOPENEX)module.GetProcAddress(strProcName);
  if (func == NULL)
  {
   return E_NOTIMPL;
  }

  return func(lppAdrBook, lppWABObject, lpWABParam, Reserved2, lpfnAllocateBuffer, lpfnAllocateMore, lpfnFreeBuffer);
 }

 static CString GetWABDllPath()
 {
  CString strValue = CRegHelper::SHRegGetString(
   HKEY_LOCAL_MACHINE,
   WAB_DLL_PATH_KEY,
   _T(""));
  if (strValue.IsEmpty())
  {
   return WAB_DLL_NAME;
  }

  return strValue;
 }
 static CString GetCurrentVersion()
 {
  CString strValue = CRegHelper::SHRegGetString(
   HKEY_LOCAL_MACHINE,
   _T("SOFTWARE\\Microsoft\\WAB\\Version Info"),
   _T("Current"));
  return strValue;
 }
 static CString GetPreviousVersion()
 {
  CString strValue = CRegHelper::SHRegGetString(
   HKEY_LOCAL_MACHINE,
   _T("SOFTWARE\\Microsoft\\WAB\\Version Info"),
   _T("Previous"));
  return strValue;
 }
---

結論は。。上記のような単純なコードでは、大丈夫でした。
もう少し、エラーの発生箇所を探ったほうがいいと思います。 > 質問者の方

つづく。。


■Windows Contacts - Windows Vista - 社本@ワック Blog
http://www.ailight.jp/blog/sha256/archive/2006/12/05/13399.aspx

■DLLを扱うクラス (CModule) - for Programmers
http://www.wac-jp.com/programmers/win32/Module.html

投稿日時 : 2007年5月28日 20:45


コメントを追加

タイトル
名前
URL
コメント