Avatar billede koonz Nybegynder
09. juni 2004 - 21:10 Der er 15 kommentarer og
1 løsning

Ovrsættelse af VB program

Nogen der kan oversætte nedstående program til Delphi.
RainbowSrv, RainbowState, RainbowLoader og RainbowObjHandler kommer alle fra dll, som jeg kan importere i Delphi

Public oSapro As RainbowSrv        'Allgemeine Rainbow Bibliothek
Public oTask As RainbowState      'Zustand des Controllers
Public oLoad As RainbowLoader      'Download Bibliothek
Public oOBJH As RainbowObjHandler  'Rainbow Objecthandler


Public Sub UpdateValues()

Set oTask = New RainbowState
Set oSapro = New RainbowSrv
Set oLoad = New RainbowLoader
Set oOBJH = New RainbowObjHandler
 
  Dim tmp As Variant
  Dim InterfaceTyp As Variant
   
    ' ***START COMM***
    InterfaceTyp = "RainbowSerSrv.CommModule02"
    oSapro.Conf.SetInterfaceType InterfaceTyp
    oSapro.Conf.SetInterfacePar "57600,8,2,N,1" 'Physikalische eigenschaften
    oSapro.Conf.SetTargetType 6
    oTask.SetInterface oSapro
    oLoad.SetInterface oSapro
    oOBJH.SetInterface oSapro
 
  ' *** TEMPERATURES ***
  tmp = oOBJH.ReadMember(0x1023 0xC56A68BA, 9)
  edtTmp.Text = tmp
     
    ' ***STOP COMM ***
  Set oSapro = Nothing
  Set oTask = Nothing
  Set oLoad = Nothing
  Set oServerIP = Nothing
End Sub
Avatar billede dkn Nybegynder
09. juni 2004 - 21:32 #1
tror det kræver lidt mere info om de typer som bliver exported til den dll.

du kunne også sige hvad det handlede om, kunne være nogle kendte et alternativ...
Avatar billede koonz Nybegynder
10. juni 2004 - 13:44 #2
Hej
Det er til kommunikatioin med en Siemens industri processor (Saphir). Ja - jeg ved godt der mangler dokumentation på COM / DLL objekter.
Jeg har lidt dokumentation på det, men det er meget sparsomt, umiddelbart er det "bare" nogle VB eksempler.

Jeg har så ud fra disse eksempler, lavet overstående - som fungerer.

Jeg prøver af få fat i noget mere dokumentation
Avatar billede hrc Mester
10. juni 2004 - 16:27 #3
Hvis du har vb-eksempler så må der også være definitioner af datastrukturerne - eller det er der måske ikke?
Avatar billede koonz Nybegynder
10. juni 2004 - 21:40 #4
Næh - stort set er det bare et eksempel, der ligner det lille program jeg har lavet. Jeg har så bare ændret nogle adresser osv.

Jeg har nu bedt leverandøren komme med noget bedre dokumentation - det er vist godt nok på tysk - hehe.

Noget andet er.
Når jeg "importerer" funktionerne i Delphi, så får jeg jo lavet nogle filer (_TLB), hvor jeg kan se funktioner, interfaces osv. Kan i se noget ud af disse filer ?

Jeg har aldrig rodet med COM / DLL i Delphi - som i nok kan se ;)
Avatar billede nico26 Nybegynder
21. juni 2004 - 17:33 #5
du skriver bare navnet på TLB'en under uses. I TLB filen er der sikkert nogle interfaces, der svarer til de objekter du laver i VB...
Avatar billede koonz Nybegynder
24. juni 2004 - 17:51 #6
Så folkens - flere oplysninger er fremskaffet (Det tog lidt tid)
Venligst tag et kig på det, og hjækp mig, jeg vil meget gerne i gang med det her, også for at lære nye områder.

Dokumenter findes her : www.blackend.dk/ObjectHandlerDocumentation.zip
Avatar billede nico26 Nybegynder
24. juni 2004 - 18:22 #7
Dokumentationen gør jo ikke meget nytte, hvis problemet er, at du ikke kan oprette objekter i Delphi... Har du prøvet at kigge i TLB filerne?
Avatar billede koonz Nybegynder
24. juni 2004 - 18:48 #8
Ja, jeg har prøvet at kigge i TLB filerne - det hjælper mig bare ikke så meget - jeg kan ikke rigtig komme i gang med at erklære min objecter / interfaces - nok mest fordi jeg ingen erfaring har i COM programmering.

Noget af det første jeg skal gøre må være at sætte Commmodule, interface osv. ligesom jeg gør i VB.

Jeg har lavet et "dump" af filen RAINBOWSERLib_TLB

her: http://www.blackend.dk/rainbowserlib.htm
Avatar billede nico26 Nybegynder
24. juni 2004 - 18:58 #9
fjong - så kan du lave et ISaproSerSrv object på denne måde

var
  oSapro : ISaproSerSrv;
...

  oSapro := CoRainbowSrv.Create;
Avatar billede koonz Nybegynder
26. juni 2004 - 10:07 #10
Den er jeg helt med på,men ........
Når jeg sætter oSapro.Conf.
Så får jeg ikke muligheden SetinterfaceType, SetInterfacePar, SetTargetType ?
Skal de tilgås på en anden måde ?
Avatar billede nico26 Nybegynder
26. juni 2004 - 16:50 #11
det er fordi oSapro.Conf har type IDispatch, så skal du bruge QueryInterface der cirka svarer til et typecast - husk at objekter kan implementere flere interfaces.

var
  oSapro : ISaproSerSrv;
  conf  : ISaproConf;
...

  oSapro := CoRainbowSrv.Create;
  if FAILED(oSapro.QueryInterface(IID_ISaproConf, conf)) then
    //handle error
Avatar billede nico26 Nybegynder
26. juni 2004 - 16:53 #12
så burde du kunne kalde conf objektets metoder

...
  conf.SetInterfaceType('InterfaceTyp');
  conf.SetInterfacePar('57600,8,2,N,1');
  conf.SetTargetType(6);
Avatar billede koonz Nybegynder
28. juni 2004 - 19:12 #13
Det ser ud til jeg er ved at nå mit mål.
Jeg skal dog lige have checket med en processor
Hvordan stopper jeg komm igen.

Jeg har ikke mulighed for at .free så jeg har prøvet at sætte := Nil. Det tror jeg dog ikke er rigtigt!!

procedure TForm1.Button4Click(Sender: TObject);
var
  oSapro : ISaproSerSrv;
  conf  : ISaproConf;
  oTask  : IRainbowState;
  oLoad  : IRainbowLoader;
  oOBJH  : IRainbowObjectHandler;
  InterfaceTyp: String;
  Value: OleVariant;
begin
  oSapro := CoRainbowSrv.Create;
  oTask  := CoRainbowState.Create;
  oLoad  := CoRainbowLoader.Create;
  oOBJH  := CoRainbowObjectHandler.Create;

  if FAILED(oSapro.QueryInterface(IID_ISaproConf, conf)) then
  Showmessage('Error')
  else
  begin
  If cmbCom.Text = 'Com 1' Then
    InterfaceTyp := 'RainbowSerSrv.CommModule01';
  If cmbCom.Text = 'Com 2' Then
    InterfaceTyp := 'RainbowSerSrv.CommModule02';
  Try
    conf.SetInterfaceType(InterfaceTyp);
    conf.SetInterfacePar('57600,8,2,N,1');
    conf.SetTargetType(6);
    oTask.SetInterface(oSapro);
    oLoad.SetInterface(oSapro);
    oObJH.SetInterface(oSapro,0);
    Value := edtResult.Text;
    oOBJH.WriteMember(edtID.Text,StrToInt(edtMember.Text),Value,EmptyParam);
  Finally;
    oSapro := Nil;
    oTask  := Nil;
    oLoad  := Nil;
    oOBJH  := Nil;
  end;
  End;
end;
Avatar billede nico26 Nybegynder
30. juni 2004 - 18:26 #14
jow, i delphi skal den bare sættes til nil. I C++ skal man kalde obj->release();
Avatar billede koonz Nybegynder
05. juli 2004 - 09:03 #15
Hej Nico26

Alt ser ud til at fungere nu - jeg takker mange gange.

Hvis du laver et svar, så skal du få dine points ;-)
Avatar billede nico26 Nybegynder
10. juli 2004 - 13:54 #16
svar :)
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