Seite 1 von 2

ComLib_PB4 mit PB 4.20 (beta 2)

Verfasst: 29.03.2008 18:27
von PurePi
Hallo zusammen,

habe im Zusammenspiel ComLib_PB4 mit PB 4.20 (beta 2) folgendes Problem festgestellt:

Beim Auslesen eines Rückgabewertes aus VBS kommt es zu generell zu einem "Invalid memory access.(read error at adress 0)".
Allerdings nur, wenn das Ganze aus einer Procedure aufgerufen wird.
(s. u.a. SampleCode)
Weitere Anmerkungen:
- unter PB 4.0 läuft das Beispiel problemlos
- gleichen Fehler gibt es auch mit der JHRegistry_420 LIB (beim ausLESEN von Registrywerten)
Mache ich irgendetwas falsch ?
Ist die MemoryVerwaltung unter PB 4.2 grundlegend geändert worden ?
Oder ist es ein Bug ?
Da ich die ComLib vielfach benutze, bin für jeglichen Hinweis dankbar.

Gruß
PurePi


SCtr_SetLanguage("VBScript")
SCtr_SetTimeOut(10000)

Procedure.s MyVBS()
VBS$ + "MyVar =" + Chr(34) +"Hallo"+ Chr(34) + #CRLF$
ProcedureReturn
EndProcedure

; folgende Aufrufe funkt. hier (aus dem Hauptprogramm) einwandfrei
; SCtr_AddCode(MyVBS())
; pbMyVar.s=SCtr_EvalStr("MyVar")


Procedure GetMyVar()
SCtr_AddCode(MyVBS())
pbMyVar.s=SCtr_EvalStr("MyVar")
EndProcedure

; Erfolgt der Aufruf aus einer Procedure gibt's "Invalid memory access.(read error at adress 0)"
GetMyVar()

Verfasst: 29.03.2008 19:05
von ts-soft
Die Lib kann ich im moment nicht finden, aber dafür gibts ja viele Alternativen:
http://www.purebasic.fr/german/viewtopi ... 5896#95896
http://www.purearea.net/pb/showcase/show.php?id=413

Gruß
Thomas

ScriptControl anstatt ComLib_PB4

Verfasst: 29.03.2008 19:36
von PurePi
@Thomas: Danke für den Hinweis
Ich sollte wohl mal sorgfältiger prüfen was ich da so schreibe....
Ich benutze die ScriptControl Lib (FileDate: 26.07.2006) und NICHT die ComLib_PB4

Mit der anderen Alternative (PureDispHelper) komme ich irgendwie nicht klar.

Gruß
Bernd

Re: ScriptControl anstatt ComLib_PB4

Verfasst: 29.03.2008 19:41
von ts-soft
PurePi hat geschrieben: Ich benutze die ScriptControl Lib (FileDate: 26.07.2006) und NICHT die ComLib_PB4
Am besten die Lib neukompilieren, dafür ist es doch OpenSource :wink:
(nicht getested)
PurePi hat geschrieben:Mit der anderen Alternative (PureDispHelper) komme ich irgendwie nicht klar.

Naja, einfach nochmal die Beispiele durcharbeiten :)

Gruß
Thomas

Verfasst: 29.03.2008 20:21
von PurePi
Besten Dank für die Info.
Das sollte von mir auch kein Gemecker sein...
Ich bin leider (zumindest was PB anbelangt) nur "Anwendungs"Programmierer :cry: und stecke ich den tieferer Systemschichten (LIBs, etc.) leider nicht tief genung drin, darum bin ich bei solchen Fehlern dann auch leider "schnell am Ende".

Zum Them die "Lib neu kompilieren" muß ich dafür nicht den Source haben ?? Wenn ja, wo gibts den ?
Habe soeben mal das Forum durchsucht nach einem HowTo "Lib erstellen/Komiplieren" aber nichts gefunden.
Gibts hier soetwas ?
Würde mich gern in die Thematik einarbeiten. <)

Was den PureDispHelper anbelangt:
-> Das habe ich rauf und runter gelesen und probiert (ohne Erfolg)
--> daher habe ich diesen Ansatz verworfen

Gruß
Bernd

Verfasst: 29.03.2008 20:38
von ts-soft
Die Sourcen sind beim Download dabei. Zum kompilieren brauchste TailBite, findeste im engl. Forum.

PureDisphelper hat viele, viele Beispiele, auch VBS!

Verfasst: 29.03.2008 20:39
von Kiffi
PurePi hat geschrieben:Was den PureDispHelper anbelangt:
-> Das habe ich rauf und runter gelesen und probiert (ohne Erfolg)
--> daher habe ich diesen Ansatz verworfen
was wolltest Du noch mal konkret machen?

Grüße ... Kiffi

Verfasst: 29.03.2008 20:43
von ts-soft
Eins der Beispiele hat auch den treffenden Namen: VBS.pb

Code: Alles auswählen

; by Kiffi and ts-soft

EnableExplicit

Procedure.s GetHtmlTitleVbs(URL$)

  Protected Script$

  Script$ = "Set myIE = CreateObject(" + #DQUOTE$ + "InternetExplorer.Application" + #DQUOTE$ + ")" + #CRLF$
  Script$ + "Do While myIE.Busy" + #CRLF$
  Script$ + "Loop" + #CRLF$
  Script$ + "myIE.Visible = False" + #CRLF$
  Script$ + "myIE.Navigate " + #DQUOTE$ + URL$ + #DQUOTE$ + #CRLF$
  Script$ + "Do While myIE.ReadyState <> 4" + #CRLF$
  Script$ + "Loop" + #CRLF$
  Script$ + "Set oDoc = myIE.Document" + #CRLF$
  Script$ + "myTitle = oDoc.title" + #CRLF$
  Script$ + "Set oDoc = Nothing" + #CRLF$
  Script$ + "Set myIE = Nothing" + #CRLF$

  ProcedureReturn Script$

EndProcedure

dhToggleExceptions(#True)

Define.l Result, obj = dhCreateObject("MSScriptControl.ScriptControl")
Define.s Script

If obj

  dhPutValue(obj, "Language = %T", @"VBScript")
  dhGetValue("%T", @Result, obj, "Language")

  If Result

    Debug "Language: " + PeekS(Result)
    dhFreeString(Result) : Result = 0

  EndIf

  dhPutValue(obj, "TimeOut = %d", 20000)
  dhGetValue("%d", @Result, obj, "TimeOut")

  Debug "TimeOut: " + Str(Result) + " ms"
  Script = GetHtmlTitleVbs("www.purebasic.com")
  dhCallMethod(obj, "AddCode(%T)", @Script)
  dhGetValue("%T", @Result, obj, "Eval(%T)", @"myTitle")

  If Result

    MessageRequester("PureBasic.com Titel:", PeekS(Result), #MB_ICONINFORMATION)
    dhFreeString(Result) : Result = 0

  EndIf

  dhReleaseObject(obj) : obj = 0

EndIf

Verfasst: 29.03.2008 21:05
von PurePi
Nochmals besten Dank.
Jo, den Source von ScriptControl habe ich gefunden (ist ja alles da, man muß nur mal genau gucken - aber heute geht bei mir irgendwie alles schief. )

Mit Tailbite werde ich mich gleich mal beschäftigen.

@kiffi
u.a. Source ist das was ich in VBS "abfahre" (und ums verrecken nicht mit dem DispHelper ans Laufen kriege).
-> Geht um MP3-Tags (lesen+schreiben)

Procedure.s TagKnecht(File$,ToDo$,Title$,Artist$,Year$,Album$,Kommentar$,ID$)

; Was is: read or write
VBS$ +"ToDo="+ Chr(34) +ToDo$+ Chr(34)+#CRLF$
; Object klar machen
VBS$ + "Set oWMP = CreateObject(" + Chr(34) + "wmPlayer.ocx" + Chr(34) + ") " + #CRLF$
VBS$ + "Set oMedia = oWMP.newMedia("+Chr(34)+File$+ Chr(34)+")" + #CRLF$
;Read
VBS$ + "If ToDo="+ Chr(34) + "Read"+ Chr(34) + " Then" + #CRLF$
VBS$ + "Duration=oMedia.GetIteminfo(" + Chr(34) + "Duration"+ Chr(34) + ") " + #CRLF$
VBS$ + "Bitrate=oMedia.GetIteminfo(" + Chr(34) + "Bitrate"+ Chr(34) + ") " + #CRLF$
VBS$ + "Titel=oMedia.GetIteminfo(" + Chr(34) + "Title"+ Chr(34) + ") " + #CRLF$
VBS$ + "Artist=oMedia.GetIteminfo(" + Chr(34) + "Artist"+ Chr(34) + ") " + #CRLF$
VBS$ + "Jahr=oMedia.GetIteminfo(" + Chr(34) + "WM/Year"+ Chr(34) + ") " + #CRLF$
VBS$ + "Album=oMedia.GetIteminfo(" + Chr(34) + "WM/AlbumTitle"+ Chr(34) + ") " + #CRLF$
VBS$ + "FileID1=oMedia.GetIteminfo(" + Chr(34) + "copyright" + Chr(34) + ") " + #CRLF$
VBS$ + "FileID2=oMedia.GetIteminfo(" + Chr(34) + "WM/UniqueFileIdentifier" + Chr(34) + ") " + #CRLF$
VBS$ + "FileID3=oMedia.GetIteminfo(" + Chr(34) + "WM/TrackNumber" + Chr(34) + ") " + #CRLF$
VBS$ + "End If"+ #CRLF$
;Write
VBS$ + "If ToDo="+ Chr(34) + "Write"+ Chr(34) + " Then" + #CRLF$
VBS$ + "Ret=oMedia.SetIteminfo(" + Chr(34) + "Title" + Chr(34) + ","+ Chr(34) +Title$+ Chr(34) + ") " + #CRLF$
VBS$ + "Ret=oMedia.SetIteminfo(" + Chr(34) + "Artist" + Chr(34) + ","+ Chr(34) +Artist$+ Chr(34) + ") " + #CRLF$
VBS$ + "Ret=oMedia.SetIteminfo(" + Chr(34) + "WM/Year" + Chr(34) + ","+ Chr(34) +Year$+ Chr(34) + ") " + #CRLF$
VBS$ + "Ret=oMedia.SetIteminfo(" + Chr(34) + "WM/AlbumTitle" + Chr(34) + ","+ Chr(34) +Album$+ Chr(34) + ") " + #CRLF$
VBS$ + "Ret=oMedia.SetIteminfo(" + Chr(34) + "Description" + Chr(34) + ","+ Chr(34) +Kommentar$+ Chr(34) + ") " + #CRLF$
VBS$ + "Ret=oMedia.SetIteminfo(" + Chr(34) + "copyright" + Chr(34) + ","+ Chr(34) +ID$+ Chr(34) + ") " + #CRLF$
VBS$ + "Ret=oMedia.SetIteminfo(" + Chr(34) + "WM/UniqueFileIdentifier" + Chr(34) + ","+ Chr(34) +ID$+ Chr(34) + ") " + #CRLF$
VBS$ + "Ret=oMedia.SetIteminfo(" + Chr(34) + "WM/TrackNumber" + Chr(34) + ","+ Chr(34) +ID$+ Chr(34) + ") " + #CRLF$
VBS$ + "End If"+ #CRLF$

ProcedureReturn


EndProcedure

Verfasst: 29.03.2008 21:30
von Kiffi
PurePi hat geschrieben:

Code: Alles auswählen

	ProcedureReturn
da haste was vergessen zu posten, oder ist das in Deinem Code auch so?

Grüße ... Kiffi