2012-05-21 3 views
1

IStorage 파일에 IPropertySetStorage을 추가하려고합니다. 작성하려고하는 속성 및 값은 내 디자인에 대한 사용자 정의입니다 (몇 개의 int, 몇 개의 문자열 등을 저장할 수도 있음). 기존의 IStorage 파일 형식을 따르려고하지 않습니다.사용자 지정 구조적 저장소 IPropertySetStorage

API와 관련 문서는 기존 파일 형식을 대상으로합니다. 이것은 관례, 따라서 (지금까지) 내가 찾은 예들은 혼란 스러웠습니다.

질문 (들)

  1. IPropertySetStorage::Create에 (PARAM 1) 어떻게 FMTID을 통과합니까? 데이터 필드에서 모두 0이 될 수 있습니까? 내가 할 수 있을까?
  2. (매개 변수 2) CLSID는 nullptr 일 수 있습니까? 그렇지 않다면 어떻게해야합니까? 부모 IStorage이 사용한 값을 알아야합니까?
  3. (매개 변수 3) 어떤 propset 플래그가 가장 좋을까요? 나는 문자열을 저장할 것이기 때문에 나는 PROPSETFLAG_DEFAULT을 사용해야한다고 생각하고있다.
  4. (param 4) IStorage 핸들이 읽기 용으로 열려 있습니다 (기존 런타임에 대한 플러그인처럼 실행 중입니다). 지금 당장 가장 좋은 방법은 STGM_DIRECT | STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_CREATE입니다. 하지만 STG_E_INVALIDFLAG

주를 받았는데, 나중에 열립니다 나는 아직로서 IStorage에 새로운 IPropertySetStorage을 만들 수 없었다, 그러나 나는 성공적으로 사용자 정의 IStream을 만들었습니다, 그리고 그것을 읽을.

내가하는 일에 더 관련이있는 자습서 링크는 멋지게 평가 될 것입니다.

EDIT 내 코드는 기존 파일에서 작업하면서 기존 응용 프로그램에서 호출됩니다. 내 코드가 호출되면 파일의 루트 IStorage이 전달됩니다. 다음은 그 코드가 모두 IStorage 인 기본 코드입니다.

rootStg->OpenStorage(name, nullptr, STGM_READ | STGM_SHARE_EXCLUSIVE, nullptr, 0, &spIStg); 
spIStg->QueryInterface(IID_IPropertySetStorage, reinterpret_cast<void**>(&pPropSetStg));  

pPropSetStg->Create(
    ::FMTID_UserDefinedProperties, 
    nullptr, 
    PROPSETFLAG_DEFAULT, 
    STGM_CREATE|STGM_READWRITE|STGM_DIRECT|STGM_SHARE_EXCLUSIVE , 
    &pPropStg); 

# 4에서 지적했듯이 STG_E_INVALIDFLAG을 반환합니다. 나는 모든 관련 코드를 붙여되면서

+1

전체 코드를 붙여주세요. 내 코드가 스 니펫과 잘 작동합니다. – Xearinox

+0

@ Xearinox 모든 관련 코드를 붙여 넣을 때 RW (작성시 RW가 아니라 이미있는 경우)가 아닌 READ 모드에서 저장소를 열어 놓고 있음을 확인했습니다. . 이로 인해 prop 세트가 작성되지 못했습니다. 어리석은 것처럼 보일 수도 있지만,이 세부 정보를 답으로 게시하면 (FW 모드에서 자신의 창고를 열어야합니다), 내가 찾은 정보를 요청한 것이므로 크레딧을주고 싶습니다. . 또한, 필자는 원래의 질문에 자세히 나와있는 것처럼 매개 변수에 관한 더 많은 정보를 고맙게 생각합니다. 고맙습니다. – payo

+1

Tommorow 나는 약간 연구를한다. 나는 결과를 줄 것이다. :-) – Xearinox

답변

0

(@Xearinox 특별 감사)

, 나는 내 저장을 열어 오전, READ 모드로 RW를하지 (내가 처음 내 부품을 집에 아이 스토리지를 만들) 발견 (작성시 RW가 있지만 이미있을 때는 RW가 아닙니다.) 이로 인해 prop 세트가 작성되지 못했습니다.

// see STGM_READWRITE (fix) 
rootStg->OpenStorage(name, nullptr, STGM_READWRITE | STGM_SHARE_EXCLUSIVE, nullptr, 0, &spIStg); 
spIStg->QueryInterface(IID_IPropertySetStorage, reinterpret_cast<void**>(&pPropSetStg));  

pPropSetStg->Create(
    ::FMTID_UserDefinedProperties, 
    nullptr, 
    PROPSETFLAG_DEFAULT, 
    STGM_CREATE|STGM_READWRITE|STGM_DIRECT|STGM_SHARE_EXCLUSIVE , 
    &pPropStg); 
관련 문제