2010-04-21 4 views
0

아카이브 파일 (7z, zip 등)에서 파일을 읽는 데 7-Zip DLL을 사용하는 프로그램을 작성하려고합니다.Qt에서 올바른 QUuid 사용? (7-Zip DLL 사용 문제 (QLibrary, QUuid GUID 변환, 인터페이스)

#include <QtCore/QCoreApplication> 
#include <QLibrary> 
#include <QUuid> 
#include <iostream> 

using namespace std; 

#include "7z910/CPP/7zip/Archive/IArchive.h" 
#include "7z910/CPP/7zip/IStream.h" 
#include "MyCom.h" 

// {23170F69-40C1-278A-1000-000110070000} 
QUuid CLSID_CFormat7z(0x23170F69, 0x40C1, 0x278A, 0x10, 0x00, 0x00, 0x01, 0x10, 0x07, 0x00, 0x00); 

typedef int (*CreateObjectFunc)( 
const GUID *clsID, 
const GUID *interfaceID, 
void **outObject); 

void readFileInArchive() 
{ 
QLibrary myLib("7z.dll"); 
CreateObjectFunc myFunction = (CreateObjectFunc)myLib.resolve("CreateObject"); 
if (myFunction == 0) { 
    cout << "CreateObject resolve failed!"; 
    return; 
} 
else { 
    cout << "CreateObject resolved"; 
} 
CMyComPtr<IOutArchive> outArchive; 
myFunction(&CLSID_CFormat7z, &IID_IOutArchive, (void **)&outArchive); 
} 

int main(int argc, char *argv[]) 
{ 
QCoreApplication a(argc, argv); 
readFileInArchive(); 
return a.exec(); 
} 

는 Qt는 창조주 즉 다음과 같은 오류로 이어질 것입니다 구축을 위해 노력 :

cannot convert 'QUuid*' to 'const GUID*' in argument passing

어떻게 올바르게 컨텍스트에서 사용할 수 QUuid해야 내가 지금까지있어 여기 어디에

이야?

또한 C++ 및 Qt 초보자이기 때문에 템플릿이나 인터페이스를 아직 파악하지 못했기 때문에 전체적으로 이러한 첫 번째 단계를 수행하는 데 문제가 있습니다. 예를 들어 이미지 파일을 ZIP 파일 (예 : Qt GUI에 나중에 * 표시됨)에서 추출 할 수있는 방법에 대한 팁이나 예제 코드를 제공 할 수 있다면 매우 높이 평가할 것입니다.

  • 현재 나의 주요 목표는 이미지 파일 (PNG, JPG 등)이 포함 된 보관 파일을 선택하고 GUI에서 해당 파일을 한 번에 하나씩 표시하기위한 GUI로 프로그램을 작성하는 것입니다. 짧은 Qt 기반 CDisplayEx.
+0

당신 솔루션에 대한 대안으로, 당신은 소스 코드 ZLIB + quazip 도서관에 구축 된 이미지 파일에 대한 간단한 버퍼 폴더를 만든 다음 압축을 해제 할 수있다 quazip 함수를 사용하면 미래에 볼 수있는 파일이 필요합니다. 적어도이 변형은 효과가있었습니다. – mosg

+0

QComicBook은 아카이브에서 임시 폴더로 이미지를 추출하여이 방법을 사용하는 것으로 보입니다. http://github.com/stolowski/QComicBook 현재 작업을 수행하고 있지만 현재 CDisplayEx가 실행하는 것과 동일한 방식으로 추출 된 이미지를 RAM에 저장하는 데 관심이 있습니다 (cdisplayex.exe는 런타임시 RAM을 더 많이 예약합니다. 아카이브 파일). 의견을 보내 주셔서 감사합니다. zlib 또는 quazip에 대해 생각하지 않았습니다. – whipsnap

+0

젠장, < and > 짧은 코드 예제를 잘라내십시오. readFileInArchive()의 잘라낸 부분은 다음과 같습니다. if (myFunction == 0) { cout << "CreateObject resolve failed!"; 반환; } else { cout << "CreateObject resolved"; } CMyComPtr outArchive; myFunction (& CLSID_CFormat7z, & IID_IOutArchive, (void **) & outArchive); – whipsnap

답변

1

명시 적 GUID에 QUuid 캐스팅해야합니다 :

QUuid boo; 
GUID uid = static_cast<GUID>(boo); 
+0

감사합니다. – whipsnap

0

두 가지 유형 중 일부 변환을 사용해야합니다. 물론 http://doc.trolltech.com/4.6/quuid.html#operator-GUID

, 이것은 크로스 플랫폼 종속적되지 않습니다 : Qt는 설명서를 보면

, 나는 윈도우 GUID에 QUuid 변환 GUID를 운영자가 있음을 발견했다.

+0

QUuid :: operator GUID() const는 어떻게 사용됩니까? – whipsnap

+0

.. 아주 기본적인 무언가 .. 아직 정확한 구문을 이해하지 못했습니다. Qt 문서에는 사용 방법에 대한 예제가 없으므로 내 원숭이는 어떻게 사용해야 하는지를 보지 못했습니다. – whipsnap

+0

@whipsnap : 한 형식에서 다른 형식으로 암시 적 변환을 허용합니다. 기본적으로 QUuid에서 GUID 변수를 생성 한 다음 전달할 수 있어야합니다. QUuid qid;/* ... */GUID gid (qid); 당신이하고있는 일을 위해 작동하지 않는 이유는 그것이 실제 객체가 아니라 포인터를 변환하려고 시도하고 있기 때문입니다. –