C++ AO讀取一個shapefile檔案的所有屬性值

來源:互聯網
上載者:User
#include "stdafx.h"
#include "iostream.h"
#include "atlbase.h"
#include "comdef.h" 字串1
#pragma warning(push)
#pragma warning(disable : 4192)
#pragma warning(disable : 4146) 字串6
#import "esriSystem.olb" \
  raw_interfaces_only,                             \
  raw_native_types,                                \
  no_namespace,                                    \
  named_guids,                                     \ 字串7
  exclude("OLE_COLOR", "OLE_HANDLE", "VARTYPE")   
#import "esriGeometry.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids          
#import "esriDataSourcesFile.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids
#import "esriGeoDatabase.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids
字串2
#pragma warning(pop)
字串5
//CString VariantToString1(VARIANT * va);
字串2
int main(int argc, char* argv[])
{
 ::CoInitialize(NULL);
字串1
 IWorkspaceFactoryPtr pWSFactory(CLSID_ShapefileWorkspaceFactory);
 IWorkspacePtr pWS;
// BSTR path;
// path = ::SysAllocString(L"C:\\test");
 HRESULT hr = pWSFactory->OpenFromFile(CComBSTR(L"C:\\test\\bj"),0,&pWS);
 
 if (FAILED(hr) || pWS==NULL)
 {
  cerr<<"Failed to open the destination folder."<<endl;
  return 1;
 } 字串1
 IFeatureWorkspacePtr pFWS(pWS);
 IFeatureClassPtr pFClass;
 pFWS->OpenFeatureClass (CComBSTR(L"bj_est1"),&pFClass);
字串3
 IFeatureCursorPtr pFCursor;
 pFClass->Search (NULL,VARIANT_TRUE,&pFCursor);
字串7
 long lngFieldCount ;
 IFieldsPtr pFields;
 IFieldPtr pField;
 pFCursor->get_Fields (&pFields);
 pFields->get_FieldCount (&lngFieldCount); 字串4
 IFeaturePtr pFeature;
 pFCursor->NextFeature (&pFeature); 字串8
 USES_CONVERSION; 字串9
 long t;
   CComBSTR bsValues;
   CComVariant varValue;
   esriFieldType esriFldType;
 while (pFeature)
 {
  bsValues = CComBSTR(L"  ");
  for (t =0; t < lngFieldCount ; t++)
  {
         pFields->get_Field(t, &pField);
      pField->get_Type(&esriFldType);
      switch (esriFldType)
      {
      case (esriFieldTypeGeometry):
     bsValues += CComBSTR(L"Shape  ");
     break;
      default:
     pFeature->get_Value(t, &varValue);
     if (varValue.vt != VT_BSTR)
       varValue.ChangeType(VT_BSTR); 字串4
     bsValues += varValue.bstrVal;
     bsValues += CComBSTR(L"  ");
     break;
      }
  } 字串3
//  _bstr_t outString(bsValues,FALSE); //方法1:為控制台輸出作準備
//  cout << outString<<endl;
                         //方法2:也可以用OLE2A來進行轉化, 
                                  //當然需要加上 USES_CONVERSION;
  cout << OLE2A(bsValues)<< endl;
  pFCursor->NextFeature (&pFeature);
 } 字串6
 pWSFactory=NULL;
 pWS=NULL;
 pFWS=NULL;
 pFClass=NULL;
 pFCursor=NULL;
 pFields=NULL;
 pField=NULL;
字串8
 ::CoUninitialize();
字串3
 return 0;
} 字串5
需要注意的地方:
--------------------------------------------
1、程式最開始要初始化COM庫,即::CoInitialize(NULL);,這個一般可以在程式最開始的地方(確切的說只要在開始使用COM組件之前就行吧),如果是做組件我想放在構造的時候是個不錯的選擇。
2、既然初始化了,最後就要卸載COM庫(暫且這麼說吧),即::CoUninitialize();。它一般在程式的最後(程式退出之前就行)。當然不要它,似乎也能運行,但還是規範點好。這裡有個問題,就是程式中用到的變數置空的問題。如果在卸載COM庫之前,不將這些變數的置空(釋放掉對象的引用),那麼在卸載的時候會得到煩人的錯誤。我就被這個錯誤困擾了好一陣子(畢竟在VB裡COM庫的初始化和卸載不要我來做)。當然在一個子過程中,我想不一定需要置空(過程結束,這些變數也就撤銷了),但作為一個好習慣,我想還是自己來做一下這個事免得出錯。
3、在Import的時候,這些庫有先後順序。比如這裡的esriGeometry.olb要放在前面,否則你會得到一個基類未定義的錯誤,因為這個基類是在esriGeometry.olb這個庫裡定義的:(
4、下面的問題全集中在字串的處理上了。COM裡用到了BSTR和VARIANT,目的COM原理的書裡都有。這兩種資料類型會出現在很多地方,搞清楚這兩種資料類型很重要。它們的使用有一些麻煩,為了方便我們使用ATL封裝的兩個類CComBSTR和CComVariant。程式在最後讀取屬性的時候可以看到,讀取的屬性值的類型很多,但我們為了在Console中輸出,需要做一些處理。字串4
[a]具體是:如果它是Geometry,那麼就直接用“Shape”來表示,如果它是其它的類型就把它轉化成BSTR,當然本身是BSTR就不用轉化了。(注意裡面用到的L"",When working with CComBSTR, use the text mapping L"" to declare constant OLECHAR strings. )
[b]對BSTR本身來說無法直接連結兩個BSTR,要串連需要轉換(如用_bstr_t類)。但CComBSTR重載了+=,真是幸福的事,呵呵。
[c]最後一步在console中輸出,cout不支援BSTR,無疑又要用到轉換了。方法有兩個:第一是用_bstr_t類,將BSTR轉換成_bstr_t類型,然後輸出;第二個是使用ATL提供的宏,OLE2A,這裡需要在程式中添加USES_CONVERSION; 程式中只要添加一次就行了。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.