Avatar billede jeppebecool Nybegynder
28. maj 2001 - 13:39 Der er 4 kommentarer

Threads & OLE Automation

Jeg er ved at lave en applikation som benytter MS-Word som Automationserver, og det virker fint.
Problemet er at det tager lang tid inden word er startet op, Og imens står mit program og venter. det ville være bedre hvis jeg havde en separate tråde til at sørge for alle de ting der har med word at gøre.
Jeg har imidlertid ikke haft held med at implementere det ( jeg får nogle forskellige kryptiske fejl ), bl.a
(\"CoInitialize ikke kaldt\"). Hvis nogen har ideer så ville jeg blive glad.

Ps. Jeg bruger delphi 4.

Hilsen Jeppe
Avatar billede torbenthyregod Nybegynder
28. maj 2001 - 13:42 #1
Følgende link kan måske hjælpe dig

http://www.techvanguards.com/com/tutorials/tips.htm
Avatar billede borrisholt Novice
28. maj 2001 - 13:42 #2
Hejsa Jeppe

Send lige dit projekt til Jens@Borisholt.com så skal jeg lige kigge på det ...

Jens B. http://fotx.net/borrisholt
Avatar billede palle_hansen Nybegynder
28. maj 2001 - 14:22 #3
Hvis du skal bruge automation i en selvstændig tråd skal du bruge CoInitializeEx når tråden startes og CoUninitialize når tråden afsluttes. Nedenstående function bruger jeg når jeg skal spørge på en OPC server state, og det virker fint.

mvh
palle

procedure TStateThread.Execute;
Var
IID_GUIDData : TGUID;
Stat        : POPCSERVERSTATUS;
begin
FServerOkay := False;
ServerIf := Nil;
Try

  HR := CoInitializeEx(Nil,COINIT_MULTITHREADED);

  If Succeeded(HR) then
  Begin

    If Trim(NodeName) = \'\' Then
    ServerIf := CreateComObject(ProgIDToClassID(ServerName)) as IOPCServer
    Else
    Begin
      IID_GUIDData := StringToGUID(GUIDStr);
      ServerIf    := CreateRemoteComObject(NodeName,IID_GUIDData) as IOPCServer;
    End;
  End;

  While (Not Terminated) And (ServerIf <> Nil) Do
  Begin
    Updated := Now;
    FServerOkay := Succeeded(ServerIf.GetStatus(Stat)) And (Stat.dwServerState = OPC_STATUS_RUNNING);
    Suspend;
  End;

Except
  on e: Exception do
  Failure := E.Message;
End;

CoUninitialize;
end;
Avatar billede jeppebecool Nybegynder
29. maj 2001 - 12:37 #4
Jeg har nu fundet ud af at det er proceduren
TOleContainer.CreateObjectFromFile , der tager tid.

Har i nogle forslag til hvordan man kan foretage dette i en tråd. Jeg får nogle irriterende fejl når jeg prøver. Det kan godt være jeg anvender CoInitialize og CoUnitialize forkert.



Det er et word dokument jeg åbner i OleContaineren, og jeg har allerede dokumentet i en _document variabel. Det virker lidt åndsvagt at man er nødt til at loade objektet (igen), når man allerede har en pointer til det.


Ps. Palle jeg forstår ikke en hat af det du har skrevet. (Hvad er HR ? ).

Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester