Hilfe für die Hamsterhilfe: VB-Beispiele

02/01/2011 - 02:04 von Steffen Hoffmann | Report spam
In der Hilfe für den News- und Mailserver Hamster Classic gibt es auch
zwei in Visual Basic geschriebene Beispiele (aufgrund des Alters der
Hilfe sehr wahrscheinlich in VB Classic), zu denen ich gern Eure Meinung
wüsste, da ich keine Ahnung vom Programmieren habe:


1) Das vermutlich einfachere Beispiel:

| Dim Hamster as Object
| Set Hamster = CreateObject( "Hamster.App" )
| MsgBox Hamster.ControlGetInfo
| Set Hamster = Nothing

Ist das VB Classic und stimmt das so? "Hamster.App" ist das
Hamster-OLE-Objekt, "ControlGetInfo" ist eine OLE-Funktion:

| ControlGetInfo: String
| Liefert die Hamster-Version und den Pfad zurück.


2) Das vermutlich komplizierte Problem:

Es geht um ein Event-Objekt und Mutex-Objekt. Das Problem ist letzteres.

Bisher steht in der Hilfe Folgendes, das in Bezug auf den Mutex wohl
flachs ist, da dies auch bei den weiteren Beispielen flasch war:

| Private Const INFINITE = &HFFFF
| Private Const SYNCHRONIZE = &H100000
|
| Private Declare Function OpenEvent Lib "kernel32" Alias "OpenEventA" _
| (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _
| ByVal lpName As String) As Long
| Private Declare Function WaitForSingleObject Lib "kernel32" _
| (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
| Private Declare Function CloseHandle Lib "kernel32" _
| (ByVal hObject As Long) As Long
|
| Dim evtHamsterIsIdle As Long, res As Long
| evtHamsterIsIdle = OpenEvent(SYNCHRONIZE, False, Mutex+"evtHamster.IsIdle")
| ' Start Hamster-Tasks
| res = WaitForSingleObject(evtHamsterIsIdle, INFINITE)
| res = CloseHandle(evtHamsterIsIdle)

Meine Frage dazu: Wie muss es in VB Classic richtig aussehen?
"evtHamster.IsIdle" ist eines der Event-Objekte des Hamsters.

Zum Vergleich das (bereits korrigierte) Beispiel für Delphi:

| uses windows;
| var evtHamsterIsIdle: THandle;
| //Pfad und Name des Hamsters: C:\Programme\Online\Hamster\hamster.exe
| const Mutex = 'mutexHamster.App.c__programme_online_hamster_hamster_exe';
| evtHamsterIsIdle := OpenEvent(SYNCHRONIZE, False, Mutex+'evtHamster.IsIdle');
| // Start Hamster-Tasks
| WaitForSingleObject(evtHamsterIsIdle, INFINITE);
| CloseHandle(evtHamsterIsIdle);


sph ... "Speravir"
 

Lesen sie die antworten

#1 W. Wolf
02/01/2011 - 10:20 | Warnen spam
"Steffen Hoffmann"
schrieb

| Dim Hamster as Object
| Set Hamster = CreateObject( "Hamster.App" )
| MsgBox Hamster.ControlGetInfo
| Set Hamster = Nothing

Ist das VB Classic und stimmt das so?



Das ist VB Classic, könnte auch VBA sein. Es wir hier mittels spàter
Bindung ein Hamster.App-Objekt erzeugt, alles Standard. Kann man
auch schöner machen:

Dim Hamster As Object
On Error GoTo CreObj_Error
Set Hamster = CreateObject("Hamster.App")
If Not Hamster Is Nothing Then MsgBox Hamster.ControlGetInfo
Set Hamster = Nothing
Exit Sub
CreObj_Error:
MsgBox Err.Description, vbCritical

[...]
Bisher steht in der Hilfe Folgendes, das in Bezug auf den Mutex wohl
flachs ist, da dies auch bei den weiteren Beispielen flasch war:

| Private Const INFINITE = &HFFFF
| Private Const SYNCHRONIZE = &H100000
|
| Private Declare Function OpenEvent Lib "kernel32" Alias "OpenEventA" _
| (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _
| ByVal lpName As String) As Long
| Private Declare Function WaitForSingleObject Lib "kernel32" _
| (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
| Private Declare Function CloseHandle Lib "kernel32" _
| (ByVal hObject As Long) As Long
|
| Dim evtHamsterIsIdle As Long, res As Long
| evtHamsterIsIdle = OpenEvent(SYNCHRONIZE, False,
Mutex+"evtHamster.IsIdle")
| ' Start Hamster-Tasks
| res = WaitForSingleObject(evtHamsterIsIdle, INFINITE)
| res = CloseHandle(evtHamsterIsIdle)

Meine Frage dazu: Wie muss es in VB Classic richtig aussehen?
"evtHamster.IsIdle" ist eines der Event-Objekte des Hamsters.

Zum Vergleich das (bereits korrigierte) Beispiel für Delphi:

| uses windows;
| var evtHamsterIsIdle: THandle;
| //Pfad und Name des Hamsters: C:\Programme\Online\Hamster\hamster.exe
| const Mutex =
'mutexHamster.App.c__programme_online_hamster_hamster_exe';
| evtHamsterIsIdle := OpenEvent(SYNCHRONIZE, False,
Mutex+'evtHamster.IsIdle');
| // Start Hamster-Tasks
| WaitForSingleObject(evtHamsterIsIdle, INFINITE);
| CloseHandle(evtHamsterIsIdle);



En vergleich der beiden Codes zeigt, dass der Mutex,
welcher in Delphi den Pfad zu der Hamster-Exe beinhaltet,
in der VB-Variante nicht initialisiert wird. Hier ist Mutex = "".
Vor der OpenEvent-Funktion müsste also noch folgende Zeile stehen:
Private Const Mutex =
"mutexHamster.App.c__programme_online_hamster_hamster_exe"
Der Code scheint sonst zumindest formal korekt zu sein.

Schönen Gruß
W. Wolf

Ähnliche fragen