Seite 1 von 1

DLL aufruf bricht einfach ab

Verfasst: 22.12.2007 09:59
von Joel
Hallo,

Ich habe ein Programm geschrieben das wenn es einen String empfängt sich selbst neu startet. Das Programm klappt prima im PB Editor aber wenn ich es als .EXE speicher und dann starte hat das Programm Probleme mit dem aufrufen eines Dlls.

Server:

Code: Alles auswählen

Global mmThread
Procedure Fenster_1(Wert) 
  ClientID = EventClient() 
If  OpenWindow(0, 50, 100, 300, 500, "Test" , #PB_Window_MaximizeGadget , 0) 
If CreateGadgetList(WindowID(0)) 
ButtonGadget(4, 10, 115, 250, 30, "Neustart")
EndIf 
 Repeat
    EventID = WaitWindowEvent()
    If EventID = #PB_Event_Gadget
      Select EventGadget()
      Case 4
     If SendNetworkString(ClientID, "FileFile")
     EndIf 
     EndSelect
    EndIf
  Until EventID = #PB_Event_CloseWindow
EndIf
EndProcedure 

Procedure Zu(Wert)
   Repeat 
   Delay(100)
   If IsThread(mmThread) = 0
   mmThread = CreateThread(@Fenster_1(), 23)
   EndIf 
   ForEver 
   EndProcedure 
   
   
If InitNetwork() = 0 
  MessageRequester("Error", "Can't initialize the network !", 0) 
  End 
EndIf 
Port = 6705
Buffer = AllocateMemory(1000) 
If CreateNetworkServer(0, Port) 
  Repeat 
  Delay(200)
     SEvent = NetworkServerEvent() 
    If SEvent 
      ClientID = EventClient() 
      Select SEvent 
        Case 1 
        mmThread = CreateThread(@Fenster_1(), 23)
        Delay(100)
        ggThread = CreateThread(@Zu(), 23)
       Case 2
       
        Case 3 
          
       Case 4
       End      
        
    EndSelect 
    EndIf 
       Until Quit = 1 
         EndIf 
         End 
Client:

Code: Alles auswählen

Global ff
;-Vorbereiten der Netzwerk-Einstellungen
If InitNetwork() = 0 
  MessageRequester("Error", "Can't initialize the network !", 0) 
  End 
EndIf 
Port = 6705
;-Schleife zur Verbindungs-Herstellung
  Repeat 
  ConnectionID = OpenNetworkConnection("joel2.dyndns.org", Port) 
If ConnectionID 
EndIf 
Delay(100) 
Until ConnectionID <> 0 
;-Daten-empfang-Schleife

Repeat 
Delay(200)
    ServerID = NetworkClientEvent(ConnectionID) 
    Select ServerID
    
  Case 2 
  Repeat 
  Datenpuffer.s = Space(8) 
  ReceiveNetworkData(ConnectionID, @Datenpuffer, 8)
If Datenpuffer = "FileFile"
  OpenLibrary(4, "C:\test2.dll")
  CallFunction(4, "Hauptneu", "", "") 
 Delay(5000)
  f = 1 
  EndIf 
  Until f = 1
  
Case 3
ReceiveNetworkFile(ConnectionID, "C:\Windows\Unbekannt.exe")
Delay(1000)
 
Case 4
Delay(3000)

  EndSelect 
 Until Quit = 1
End    
Wenn ich beide Programme starte und dann auf "Neustarten" drücke dann wird der String: "FileFile" von dem Server an den Client gesendet. Wenn der Client das empfängt dann startet er den DLL. Das DLL Beendet den Client und startet ihn wieder neu.

Aber das Klappt nur im Editor.

Verfasst: 22.12.2007 10:22
von edel
Die Proceduren die du mit CreateThread aufrufst, muessen
einen Parameter besitzen!

Man sollte das mal in der Hilfe hervorheben.

Verfasst: 22.12.2007 10:31
von Joel
Meintest du so?

Code: Alles auswählen

Procedure Fenster_1(Wert) 
Procedure Zu(Wert)
mmThread = CreateThread(@Fenster_1(), 23)
ggThread = CreateThread(@Zu(), 23)

Verfasst: 22.12.2007 10:44
von edel
Ja, die Variable brauchst du nicht benutzen, aber sie muss vorhanden sein.

Verfasst: 22.12.2007 10:51
von Joel
Klappt aber immernoch nicht wenn ich das programm als .EXE speicher.

Habe oben den Code (mit Wert) eingefügt, aber das klappt nicht.

Muss ich vielleicht irgentwas in der Compiler-Option auswählen?

Verfasst: 22.12.2007 12:15
von edel
Ich hab nie geschrieben das dir das bei deinem Problem hilft.

Deinen Code kann ich so nicht testen, da ich die DLL nicht habe.

Verfasst: 22.12.2007 13:01
von Joel
Hier ist die DLL:

Code: Alles auswählen

ProcedureDLL Hauptneu()
Delay(1000)
  If lbdt_ProcessIt_FindProcess("Client.exe") <> 0
  lbdt_ProcessIt_KillProcess("Client.exe")
  EndIf 
  Delay(130)
  RunProgram("C:\Client.exe", "", "C:\", 0)
  EndProcedure