Bạn hiện đang ngoại tuyến, hãy chờ internet để kết nối lại

Làm thế nào để đọc thuộc tính tài liệu hợp chất trực tiếp với VC ++

QUAN TRỌNG: Bài viết này được dịch bằng phần mềm dịch máy của Microsoft chứ không phải do con người dịch. Microsoft cung cấp các bài viết do con người dịch và cả các bài viết do máy dịch để bạn có thể truy cập vào tất cả các bài viết trong Cơ sở Kiến thức của chúng tôi bằng ngôn ngữ của bạn. Tuy nhiên, bài viết do máy dịch không phải lúc nào cũng hoàn hảo. Loại bài viết này có thể chứa các sai sót về từ vựng, cú pháp hoặc ngữ pháp, giống như một người nước ngoài có thể mắc sai sót khi nói ngôn ngữ của bạn. Microsoft không chịu trách nhiệm về bất kỳ sự thiếu chính xác, sai sót hoặc thiệt hại nào do việc dịch sai nội dung hoặc do hoạt động sử dụng của khách hàng gây ra. Microsoft cũng thường xuyên cập nhật phần mềm dịch máy này.

Nhấp chuột vào đây để xem bản tiếng Anh của bài viết này:186898
Bài viết này đã được lưu trữ. Bài viết được cung cấp "nguyên trạng" và sẽ không còn được cập nhật nữa.
TÓM TẮT
Bạn có thể lấy các thuộc tính tài liệu hợp chất từ một tài liệu bằng cách sử dụngtiêu chuẩn giao diện mà không có máy chủ chạy hoặc thậm chí đang được cài đặt. ChoVí dụ, bạn có thể lấy các thuộc tính được xây dựng trong tài liệu như là tác giả,Thời gian qua lần, và thuộc tính trang Count một Microsoft văn phòng 97tài liệu cũng như các thuộc tính tuỳ chỉnh tài liệu khác.
THÔNG TIN THÊM
Các bước sau đây minh họa như thế nào bạn có thể xây dựng một tài liệu hợp chấtbất động sản người xem với Microsoft Visual C++. Ví dụ là một giao diện điều khiển Win32Ứng dụng dự án, và có thể sửa đổi cho phù hợp với nhu cầu của bạn.

Các bước để tạo mẫu

  1. Tạo một dự án Win32 giao diện điều khiển ứng dụng mới, và gọi nó là PropDump.
  2. Thêm một tập tin mới được gọi là main.cpp để dự án của bạn.
  3. Copy đoạn mã sau vào main.cpp:
       #include <stdio.h>   #include <windows.h>   #include <ole2.h>   #include <locale.h>   // Dumps simple PROPVARIANT values.   void DumpPropVariant(PROPVARIANT *pPropVar) {      // Don't iterate arrays, just inform as an array.      if(pPropVar->vt & VT_ARRAY) {         printf("(Array)\n");         return;      }      // Don't handle byref for simplicity, just inform byref.      if(pPropVar->vt & VT_BYREF) {         printf("(ByRef)\n");         return;       }      // Switch types.      switch(pPropVar->vt) {      case VT_EMPTY:         printf("(VT_EMPTY)\n");         break;      case VT_NULL:         printf("(VT_NULL)\n");         break;      case VT_BLOB:         printf("(VT_BLOB)\n");         break;      case VT_BOOL:         printf("%s (VT_BOOL)\n",         pPropVar->boolVal ? "TRUE/YES" : "FALSE/NO");         break;      case VT_I2: // 2-byte signed int.         printf("%d (VT_I2)\n", (int)pPropVar->iVal);         break;      case VT_I4: // 4-byte signed int.         printf("%d (VT_I4)\n", (int)pPropVar->lVal);         break;      case VT_R4: // 4-byte real.         printf("%.2lf (VT_R4)\n", (double)pPropVar->fltVal);         break;      case VT_R8: // 8-byte real.         printf("%.2lf (VT_R8)\n", (double)pPropVar->dblVal);         break;         case VT_BSTR: // OLE Automation string.         {            // Translate into ASCII.            char dbcs[1024];            char *pbstr = (char *)pPropVar->bstrVal;            int i = wcstombs(            dbcs, pPropVar->bstrVal, *((DWORD *)(pbstr-4)));            dbcs[i] = 0;            printf("%s (VT_BSTR)\n", dbcs);         }         break;      case VT_LPSTR: // Null-terminated string.         {         printf("%s (VT_LPSTR)\n", pPropVar->pszVal);         }         break;      case VT_FILETIME:         {            char *dayPre[] =                         {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};            FILETIME lft;            FileTimeToLocalFileTime(&pPropVar->filetime, &lft);                SYSTEMTIME lst;            FileTimeToSystemTime(&lft, &lst);            printf("%02d:%02d.%02d %s, %s %02d/%02d/%d (VT_FILETIME)\n",               1+(lst.wHour-1)%12, lst.wMinute, lst.wSecond,               (lst.wHour>=12) ? "pm" : "am",               dayPre[lst.wDayOfWeek%7],               lst.wMonth, lst.wDay, lst.wYear);         }         break;      case VT_CF: // Clipboard format.         printf("(Clipboard format)\n");         break;      default: // Unhandled type, consult wtypes.h's VARENUM structure.         printf("(Unhandled type: 0x%08lx)\n", pPropVar->vt);         break;      }   }   // Dump's built-in properties of a property storage.   void DumpBuiltInProps(IPropertySetStorage *pPropSetStg) {      printf("\n==================================================\n");      printf("BuiltInProperties Properties...\n");      printf("==================================================\n");      IPropertyStorage *pPropStg = NULL;      HRESULT hr;      // Open summary information, getting an IpropertyStorage.      hr = pPropSetStg->Open(FMTID_SummaryInformation,      STGM_READ | STGM_SHARE_EXCLUSIVE, &pPropStg);      //hr = pPropSetStg->Open(FMTID_UserDefinedProperties,         //STGM_READ | STGM_SHARE_EXCLUSIVE, &pPropStg);      if(FAILED(hr)) {         printf("No Summary-Information.\n");         return;      }      // Array of PIDSI's you are interested in.      struct pidsiStruct {         char *name;         long pidsi;      } pidsiArr[] = {         {"Title",            PIDSI_TITLE}, // VT_LPSTR         {"Subject",          PIDSI_SUBJECT}, // ...         {"Author",           PIDSI_AUTHOR},         {"Keywords",         PIDSI_KEYWORDS},         {"Comments",         PIDSI_COMMENTS},         {"Template",         PIDSI_TEMPLATE},         {"LastAuthor",       PIDSI_LASTAUTHOR},         {"Revision Number",  PIDSI_REVNUMBER},         {"Edit Time",        PIDSI_EDITTIME}, // VT_FILENAME (UTC)         {"Last printed",     PIDSI_LASTPRINTED}, // ...         {"Created",          PIDSI_CREATE_DTM},         {"Last Saved",       PIDSI_LASTSAVE_DTM},         {"Page Count",       PIDSI_PAGECOUNT}, // VT_I4         {"Word Count",       PIDSI_WORDCOUNT}, // ...         {"Char Count",       PIDSI_CHARCOUNT},         {"Thumpnail",        PIDSI_THUMBNAIL}, // VT_CF         {"AppName",          PIDSI_APPNAME}, // VT_LPSTR         {"Doc Security",     PIDSI_DOC_SECURITY}, // VT_I4         {0, 0}      };      // Count elements in pidsiArr.      int nPidsi = 0;      for(nPidsi=0; pidsiArr[nPidsi].name; nPidsi++);      // Initialize PROPSPEC for the properties you want.      PROPSPEC *pPropSpec = new PROPSPEC [nPidsi];      PROPVARIANT *pPropVar = new PROPVARIANT [nPidsi];      for(int i=0; i<nPidsi; i++) {         ZeroMemory(&pPropSpec[i], sizeof(PROPSPEC));         pPropSpec[i].ulKind = PRSPEC_PROPID;         pPropSpec[i].propid = pidsiArr[i].pidsi;      }      // Read properties.      hr = pPropStg->ReadMultiple(nPidsi, pPropSpec, pPropVar);      if(FAILED(hr)) {         printf("IPropertyStg::ReadMultiple() failed w/error %08lx\n",                hr);      }      else {         // Dump properties.         for(i=0; i<nPidsi; i++) {            printf("%16s: ", pidsiArr[i].name);            DumpPropVariant(pPropVar + i);         }      }      // De-allocate memory.      delete [] pPropVar;      delete [] pPropSpec;      // Release obtained interface.      pPropStg->Release();   }   // Dump's custom properties of a property storage.   void DumpCustomProps(IPropertySetStorage *pPropSetStg) {      printf("\n==================================================\n");      printf("Custom Properties...\n");      printf("==================================================\n");      IPropertyStorage *pPropStg = NULL;      HRESULT hr;      IEnumSTATPROPSTG *pEnumProp;      // Open User-Defined-Properties, getting an IpropertyStorage.      hr = pPropSetStg->Open(FMTID_UserDefinedProperties,         STGM_READ | STGM_SHARE_EXCLUSIVE, &pPropStg);      if(FAILED(hr)) {         printf("No User Defined Properties.\n");         return;      }      // Get property enumerator.      hr = pPropStg->Enum(&pEnumProp);      if(FAILED(hr)) {      pPropStg->Release();         printf("Couldn't enumerate custom properties.\n");         return;      }      // Enumerate properties.      STATPROPSTG sps;      ULONG fetched;      PROPSPEC propSpec[1];      PROPVARIANT propVar[1];      while(pEnumProp->Next(1, &sps, &fetched) == S_OK) {         // Build a PROPSPEC for this property.         ZeroMemory(&propSpec[0], sizeof(PROPSPEC));         propSpec[0].ulKind = PRSPEC_PROPID;         propSpec[0].propid = sps.propid;         // Read this property.         hr = pPropStg->ReadMultiple(1, &propSpec[0], &propVar[0]);         if(!FAILED(hr)) {            // Translate Prop name into ASCII.            char dbcs[1024];            char *pbstr = (char *)sps.lpwstrName;            int i = wcstombs(dbcs, sps.lpwstrName,                             *((DWORD *)(pbstr-4)));            dbcs[i] = 0;            // Dump this property.            printf("%16s: ", dbcs);            DumpPropVariant(&propVar[0]);         }      }      // Release obtained interface.      pEnumProp->Release();      pPropStg->Release();   }   // Dump's custom and built-in properties of a compound document.   void DumpProps(char *filename) {      // Translate filename to Unicode.      WCHAR wcFilename[1024];      setlocale( LC_ALL, "" );      int i = mbstowcs(wcFilename, filename, strlen(filename));      setlocale( LC_ALL, "C" );      wcFilename[i] = 0;      IStorage *pStorage = NULL;      IPropertySetStorage *pPropSetStg = NULL;      HRESULT hr;      // Open the document as an OLE compound document.      hr = ::StgOpenStorage(wcFilename, NULL,      STGM_READ | STGM_SHARE_EXCLUSIVE, NULL, 0, &pStorage);      if(FAILED(hr)) {         if(hr == STG_E_FILENOTFOUND)            printf("File not found.");         else if(hr == STG_E_FILEALREADYEXISTS)            printf("Not a compound file.");         else            printf("StgOpenStorage() failed w/error %08lx", hr);         return;      }      // Obtain the IPropertySetStorage interface.      hr = pStorage->QueryInterface(              IID_IPropertySetStorage, (void **)&pPropSetStg);      if(FAILED(hr)) {         printf("QI for IPropertySetStorage failed w/error %08lx", hr);         pStorage->Release();         return;      }      // Dump properties.      DumpBuiltInProps(pPropSetStg);      DumpCustomProps(pPropSetStg);      // Release obtained interfaces.      pPropSetStg->Release();      pStorage->Release();   }   // Program entry-point.   void main(int argc, char **argv) {      // Validate arguments.      if(argc != 2) {         printf("- OLE Document Property Viewer\n");         printf("- Usage: %s filename", argv[0]);         return;      }      // Pass filename to the subroutine.      DumpProps(argv[1]);   }					
  4. Biên dịch chương trình.
Để chạy các ví dụ, bạn nên sao chép các tập tin PropDump.exe vào một thư mục trongđường dẫn mặc định của bạn; Ví dụ c:\Windows\ hoặc c:\Windows\Command\. Sau đó,trong một thư mục có chứa một tập tin hợp chất tài liệu, loại PropDump theo sautên tập tin. Bạn sẽ thấy đầu ra tương tự như sau:

==================================================

Thuộc tính BuiltInProperties...

           Title: MyTitle (VT_LPSTR)         Subject: MySubject (VT_LPSTR)          Author: MyAuthor (VT_LPSTR)        Keywords: MyKeywords (VT_LPSTR)        Comments: MyComments (VT_LPSTR)        Template: Normal (VT_LPSTR)      LastAuthor: Me (VT_LPSTR) Revision Number: 8 (VT_LPSTR)       Edit Time: 01:05.47 pm, Mon 01/01/1601 (VT_FILETIME)    Last printed: (VT_EMPTY)         Created: 01:42.00 pm, Fri 05/29/1998 (VT_FILETIME)      Last Saved: 12:31.00 pm, Mon 06/01/1998 (VT_FILETIME)      Page Count: 1 (VT_I4)      Word Count: 3 (VT_I4)      Char Count: 19 (VT_I4)       Thumpnail: (VT_EMPTY)         AppName: Microsoft Word 8.0 (VT_LPSTR)    Doc Security: 0 (VT_I4)				
==================================================

Thuộc tính tùy chỉnh...

   _PID_LINKBASE: (VT_BLOB)       _PID_GUID: (VT_BLOB)       CustProp1: CustProp1TextValue (VT_LPSTR)       CustProp2: 77777 (VT_I4)       CustProp3: TRUE/YES (VT_BOOL)       CustProp4: 00:00.00 am, Tue 05/17/1977 (VT_FILETIME)				

Thêm ghi chú

Các giao diện IPropertyStorage và IPropertySetStorage không được xác định trongviệc phát hành bản gốc của COM; do đó mã mẫu này đòi hỏi một hệ thống với:
  • Windows NT 4.0 hoặc cao hơn
  • Windows 95 với Internet Explorer phiên bản 4.0 hoặc cao hơn
  • Windows 95 với DCOM cài đặt
Phiên bản trước của COM chỉ định rất ít đối với thuộc tínhvà sử dụng của họ, nhưng đã xác định một định dạng đăng trên cho phép các nhà phát triểnđể lưu trữ các tài sản và tài sản bộ trong một thể hiện IStorage. Bất động sảnđịnh danh và ngữ nghĩa của một bộ tài sản duy nhất, được sử dụng cho bản tóm tắtthông tin về một tài liệu, cũng đã được xác định. Tại thời điểm đó, nó đãcần thiết để tạo và thao tác đó cơ cấu trực tiếp như là một dữ liệudòng. Cho biết thêm thông tin trên các thiết lập tài sản xuất định dạng dữ liệucơ cấu tổ chức, đề cập đến "OLE đăng trên bất động sản Set Format" trong MicrosoftNhà phát triển mạng.

(c) tập đoàn Microsoft 1999, tất cả các quyền. Những đóng góp của Joe Crump, Microsoft Corporation.

THAM KHẢO
Microsoft Developer Network: Tài sản liên tục Sets

Microsoft Developer Network: OLE đăng trên bất động sản đặt định dạng

Excel từ truy cập Powerpoint Binder documentproperties builtindocumentproperties customdocumentproperties

Cảnh báo: Bài viết này được dịch tự động

Thuộc tính

ID Bài viết: 186898 - Xem lại Lần cuối: 12/05/2015 08:45:19 - Bản sửa đổi: 2.0

Microsoft Project 2000 Standard Edition, Microsoft Excel 2000 Standard Edition, Microsoft Visual C++ 5.0 Enterprise Edition, Microsoft Visual C++ 5.0 Professional Edition, Microsoft Excel 97 Standard Edition, Microsoft PowerPoint 97 Standard Edition, Microsoft Word 97 Standard Edition, Microsoft PowerPoint 2000 Standard Edition, Microsoft Word 2000 Standard Edition, Microsoft Excel 2002 Standard Edition, Microsoft PowerPoint 2002 Standard Edition, Microsoft Word 2002 Standard Edition

  • kbnosurvey kbarchive kbcmpdoc kbfaq kbhowto kbmt KB186898 KbMtvi
Phản hồi