วิธีการอ่านคุณสมบัติของเอกสารประกอบโดยตรงกับ VC ++

ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ

ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้:186898
บทความนี้ถูกเก็บถาวรแล้วเนื้อหาของบทความจึงถูกนำเสนอ "ตามลักษณะที่เป็น" และจะไม่มีการปรับปรุงข้อมูลอีก
สรุป
คุณสามารถเรียกคุณสมบัติของเอกสารประกอบจากเอกสารใช้อินเทอร์เฟซมาตรฐาน โดยไม่มีเซิร์ฟเวอร์ที่เรียกใช้ หรือแม้แต่มีการติดตั้ง ตัวอย่าง คุณสามารถเรียกคุณสมบัติของเอกสารที่มีอยู่แล้วเช่นผู้เขียน เวลาที่ถูกปรับเปลี่ยนล่าสุด และ จำนวนหน้าคุณสมบัติของเอกสาร Microsoft Office 97 รวมทั้งคุณสมบัติเอกสารแบบกำหนดเองอื่น ๆ
ข้อมูลเพิ่มเติม
ขั้นตอนต่อไปนี้แสดงให้เห็นถึงวิธีการที่คุณสามารถสร้างตัวแสดงคุณสมบัติของเอกสารที่ประกอบ ด้วย Microsoft ในการ Visual c ++ ตัวอย่างโครงการแอพลิเคชันคอนโซล Win32 และสามารถปรับเปลี่ยนให้เหมาะสมกับความต้องการของคุณ

ขั้นตอนในการสร้างตัวอย่าง

  1. สร้างโครงการใหม่ของแอพลิเคชันคอนโซล Win32 และเรียก PropDump
  2. เพิ่มแฟ้มใหม่ที่เรียกว่า main.cpp โครงการของคุณ
  3. คัดลอกรหัสต่อไปนี้ลงใน 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. การคอมไพล์โปรแกรม
การเรียกใช้ตัวอย่าง คุณควรสำเนา PropDump.exe แฟ้มไปยังไดเรกทอรีในเส้นทางของคุณเริ่มต้น สำหรับอินสแตนซ์ c:\Windows\ หรือ c:\Windows\Command\ จากนั้น ในไดเรกทอรีประกอบด้วยแฟ้มเอกสารประกอบ พิมพ์ PropDump ตาม ด้วยชื่อของแฟ้ม คุณควรเห็นผลลัพธ์ที่คล้ายกับข้อความต่อไปนี้:

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

คุณสมบัติ 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)				
==================================================

คุณสมบัติแบบกำหนดเอง...

   _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)				

หมายเหตุเพิ่มเติม

อินเทอร์เฟซ IPropertyStorage และ IPropertySetStorage ไม่ได้ถูกกำหนดไว้ในสเดิมของ COM ดัง ตัวอย่างรหัสนี้จำเป็นต้องใช้ระบบด้วย:
  • windows NT 4.0 หรือรุ่นใหม่กว่า
  • windows 95 กับ Internet Explorer รุ่น 4.0 หรือรุ่นใหม่กว่า
  • windows 95 ด้วย DCOM ที่ติดตั้ง
ระบุรุ่นก่อนหน้าของ COM มาก little ด้วยเคารพคุณสมบัติและการใช้งานของพวกเขา แต่ไม่กำหนดรูปแบบอนุกรมที่นักพัฒนาที่เก็บคุณสมบัติและการตั้งค่าคุณสมบัติในอินสแตนซ์ IStorage ที่ได้รับอนุญาต ตัวระบุคุณสมบัติและหมายชุดคุณสมบัติที่หนึ่ง ใช้ข้อมูลสรุปเกี่ยวกับเอกสาร ถูกกำหนดไว้ ในขณะนั้น ไม่จำเป็นในการสร้าง และจัดการโครงสร้างที่เป็นกระแสข้อมูลข้อมูลโดยตรง สำหรับข้อมูลเพิ่มเติมเกี่ยวกับคุณสมบัติที่กำหนดโครงสร้างการจัดรูปแบบข้อมูลแบบอนุกรม การอ้างอิงถึงรูป "OLE Serialized คุณสมบัติชุดแบบ" ในเครือข่ายของนักพัฒนา Microsoft

(c) Microsoft Corporation 1999 สงวนลิขสิทธิ์ contributions โดย Joe Crump, Microsoft Corporation

ข้อมูลอ้างอิง
เครือข่ายของนักพัฒนาของ Microsoft: ชุดคุณสมบัติ Persistent

นักพัฒนา Microsoft Network: OLE Serialized รูปแบบการตั้งค่าคุณสมบัติ

customdocumentproperties builtindocumentproperties documentproperties Excel Word Access Powerpoint Binder

คำเตือน: บทความนี้ได้รับการแปลโดยอัตโนมัติ

คุณสมบัติ

รหัสบทความ: 186898 - การตรวจสอบครั้งสุดท้าย: 12/05/2015 08:45:18 - ฉบับแก้ไข: 4.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 KbMtth
คำติชม