Jump to content


This is a ready-only archive of the InstallSite Forum. You cannot post any new content here. / Dies ist ein Archiv des InstallSite Forums. Hier können keine neuen Beiträge veröffentlicht werden.
Photo

Probleme bei der Integration von UnRar.Dll


3 replies to this topic

H.-P. Schmitt

H.-P. Schmitt
  • Members
  • 3 posts

Posted 15 July 2004 - 12:23

Hallo zusammen!


Ich möchte/muss die UnRar.dll von WinRar in mein Setup integrieren, weil ich vorgefertigte RAR-Dateien/Pakete bei der Installation auf den Rechner entpacken muss OHNE über eine selbstextraierendes Rar-Datei zu gehen.

Irgendwie gelingt es mir jedoch nicht so richtig...

Ich habe das Thema schon einmal vor ein paar Wochen im InstallShield-Forum gepostet, aber leider ohne Antwort...
In der Hoffnung doch noch eine Lösung zu finden, versuche ich mein Glück jetzt hier.

Ich verwende InstallShield Professional 6.12 German.


Das Laden/Entladen der Unrar.dll und das Auslesen der Version über die in Unrar.dll eingebauten Funktion UNRAR.RARGetDllVersion() klappt und ist kein Problem.

Doch leider bekomme ich es nicht hin, ein Archiv zu öffnen und eine Datei zu entpacken.

Jedesmal wenn ich das Archiv mit UNRAR.RAROpenArchive öffne, dann scheint das Setup abzubrechen und sich zu beenden. Im Debugger kann man dann sehen, dass unmittelbar nach dem RAROPenArchive das Ereignis OnEnd.rul aufgerufen wird.
IKernel.exe bleibt dann meistens im Speicher hängen.

Hat noch jemand eine Idee was ich falsch gemacht habe?
Ich vermute mal, das irgendwas mit den Pointern auf die Struct RAROpenArchiveData nicht stimmt - habe aber schon vieles probiert und bin jetzt am Ende meiner Kunst ;-)


Das Script und die Definitionen sind weiter unten aufgeführt.


Im Voraus Besten Dank für die Hilfe!




--

//Define struct
typedef RAROpenArchiveData
begin
POINTER ArcName;
LONG OpenMode;
LONG OpenResult;
POINTER CmtBuf;
LONG CmtBufSize;
LONG CmtSize;
LONG CmtState;
end;

//Rar Archiv-Mode
#define RAR_OM_EXTRACT 1 //Mode: Test/Extract


//UnRar.dll Prototype Deklarationen
prototype LONG UNRAR.RARGetDllVersion();
prototype LONG UNRAR.RAROpenArchive(BYREF RAROpenArchiveData POINTER);

//Abhandlung UnRar-Schnittstelle
prototype BOOL fctUnRar(BYVAL STRING, BYVAL STRING);


function BOOL fctUnRar (RarSource, RarDestination)
NUMBER Result;
BOOL DllLoaded;
NUMBER RarHandle;
STRING CmtBuffer[16384];

RAROpenArchiveData RarOpenArchiveDataStruct;
RAROpenArchiveData POINTER ptnRarOpenArchiveData;

begin

//TEST
RarSource = "p:\\Test.is\\Test.rar";

//UnRar DLL in den Speicher laden
Result = UseDLL (SUPPORTDIR^"UNRAR.DLL");
if (Result = 0) then
DllLoaded = TRUE;
else
//DLL nicht geladen, dann Fehler
MessageBox ("Error loadinf unrar.dll", INFORMATION);
DllLoaded = FALSE;
endif;

//Get UnRar Dll version (works fine...)
Result = UNRAR.RARGetDllVersion();

//Get pointer on struct fctUnRar
ptnRarOpenArchiveData = &RarOpenArchiveDataStruct;

//Set source
ptnRarOpenArchiveData->ArcName = &RarSource;

//Set mode
ptnRarOpenArchiveData->OpenMode = RAR_OM_EXTRACT;

//Set buffer for comment (No comment needed)
ptnRarOpenArchiveData->CmtBuf = &CmtBuffer;
ptnRarOpenArchiveData->CmtBufSize = StrLength(CmtBuffer);

//Open archive / get handle
RarHandle = RAROpenArchive(ptnRarOpenArchiveData);
//Hier bricht das Setup ab und das Event OnEnd wird aufgerufen...

MessageBox("OK", INFORMATION);


//...

return 0;

end;



--


unrar Definitionen laut Doku Unrar

struct RAROpenArchiveData
{
char *ArcName;
unsigned int OpenMode;
unsigned int OpenResult;
char *CmtBuf;
unsigned int CmtBufSize;
unsigned int CmtSize;
unsigned int CmtState;
};

...

HANDLE PASCAL RAROpenArchive(struct RAROpenArchiveData *ArchiveData);
int PASCAL RARGetDllVersion();

Stefan Krueger

Stefan Krueger

    InstallSite.org

  • Administrators
  • 13,269 posts

Posted 15 July 2004 - 21:01

prototype LONG UNRAR.RAROpenArchive(BYREF RAROpenArchiveData POINTER);

Das ist doch letztlich ein Pointer auf einen Pointer, oder? Probier's mal mit:

prototype LONG UNRAR.RAROpenArchive(BYREF RAROpenArchiveData);

und ändere den Aufruf
RarHandle = RAROpenArchive(ptnRarOpenArchiveData);
in:

RarHandle = RAROpenArchive(RarOpenArchiveData);


H.-P. Schmitt

H.-P. Schmitt
  • Members
  • 3 posts

Posted 20 July 2004 - 06:25

Hallo Stefan!

Vielen Dank für deinen Tipp.


Leider klappt das mit dem Ändern des Prototyp so nicht. Beim Kompilieren kommt der Fehler:

Fehler C8018: 'RAROpenArchiveData' : typedef Objekt in diesem Zusammenhang unzulässig

Muss wohl doch ein Pointer bleiben...

Schade - wäre ja auch zu einfach und schön gewesen.

Hast du sonst noch einen Tipp?




H.-P. Schmitt

H.-P. Schmitt
  • Members
  • 3 posts

Posted 12 November 2004 - 13:40

Das Problem hat sich erledigt.

Vielen Dank an Harald Janocha für die Hilfe.
"Was lange währt wird manchmal gut" ;-)


Für alle die, die auch Interesse an der Lösung haben, habe ich das entsprechende Beispielscript angehangen.

Attached Files