Probs bei Procraufruf mit XML Befehlen aus einer DLL heraus

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Lukaso
Beiträge: 720
Registriert: 08.09.2004 18:51
Wohnort: Oberkirch
Kontaktdaten:

Probs bei Procraufruf mit XML Befehlen aus einer DLL heraus

Beitrag von Lukaso »

Hallo,

ich habe für aktuelles Projekt eine Pluginschnitstelle. Dabei stellt die Mainexe verschiedene fertige Proceduren, ich übergebe die Zeiger der Proceduren an die DLLs die ich lade und per Prototypes kann ich diese darin verwenden (funktionierte bei bisher über 100 recht großen Procs ohne Probleme).

Ich habe allerdings vor Sprachdateien, das Netzwerkprotokoll sowie das speichern von Einstellungen mit XML-Dateien zu regeln.

Dafür hab ich eine Proceduren im Hauptprogramm die das ganze Verwalten, Pointer zu Nodes sowie das XML-Handle (#PB_Any) speichere ich in der Mainexe in einer Globalen Struktur.

Ich kann auch alle Funktionen wie gewünscht in der Mainexe verwenden, allerdings gibts nen Speicherfehler wenn ich versuche diese von den DLLs aus aufzurufen. Die Pointer der Nodes etc. scheinen vorhanden zu sein allerdings ungültig bei Aufrufen aus einer DLL.

Ich denke ich habe da einen Denkfehler (ich möchte nur ungern die XML-Lib die 100kb wiegt in die kleinen Plugindlls, für jede einzeln, einbinden).

Ich hoffe jemand kann mir sagen wieso das so ist ... :cry:

Beispielcode kann ich nach der Arbeit posten :roll:


Danke Lukas
Nextgen Guild Wars Fanseite: Guild Wars Tactics (Pseudo-Admin + Developer)
"Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht." - Unbekannter Autor
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> ich übergebe die Zeiger der Proceduren an die DLLs

> speichere ich in der Mainexe in einer Globalen Struktur.

diese beiden Verfahrensweisen scheinen nicht gleichwertig zu sein.
irgendwas machst du im zweiten Fall entscheidend anders.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Lukaso
Beiträge: 720
Registriert: 08.09.2004 18:51
Wohnort: Oberkirch
Kontaktdaten:

Beitrag von Lukaso »

Habe gerade bemerkt das es nur zum Absturz kommt wenn ich die Funktion aus der Mainexe aus einem Thread in der DLL heraus aufrufe, direkt in der Proc der DLL die von der Exe aufgerufen wird gehts ...

Zum testen:

test.exe

Code: Alles auswählen

EnableExplicit

Structure uGWCoreOption
  sFile.s
  hXML.l
  hRootNode.l
  hMainNode.l
EndStructure


Define uGWCoreOption.uGWCoreOption


Procedure.b GWCoreOptionClose()
  
  Shared uGWCoreOption
  
  Protected bReturn.b = #False
  
  With uGWCoreOption
    
    If \hXML
      
      FreeXML(\hXML)
      \hXML = #Null
      \hRootNode = #Null
      \hMainNode = #Null
      bReturn = #True
      
    EndIf
    
  EndWith
  
  ProcedureReturn bReturn
  
EndProcedure

Procedure.b GWCoreOptionSave()
  
  Shared uGWCoreOption
  
  Protected bReturn.b = #False
  
  With uGWCoreOption
    
    If \hXML
      
      FormatXML(\hXML, #PB_XML_WindowsNewline | #PB_XML_ReduceNewline | #PB_XML_ReIndent)
      SaveXML(\hXML, \sFile, #PB_XML_StringFormat)
      
    EndIf
    
  EndWith
  
  ProcedureReturn bReturn
  
EndProcedure

Procedure.l GWCoreOptionInit()
  
  Shared uGWCoreOption
  
  With uGWCoreOption
    
    \sFile = "test.xml"
    
    \hXML = LoadXML(#PB_Any, \sFile, #PB_Unicode)
    
    If \hXML
      
      If XMLStatus(\hXML) = #PB_XML_Success
        
        \hRootNode = RootXMLNode(\hXML)
        \hMainNode = MainXMLNode(\hXML)
        
        If Not \hRootNode Or Not \hRootNode Or Not GetXMLNodeName(\hMainNode) = "gwcore"
          
          GWCoreOptionClose()
          
        EndIf
        
      Else
        
        GWCoreOptionClose()
        
      EndIf
      
    EndIf
    
    If Not \hXML
      
      DeleteFile(\sFile)
      \hXML = CreateXML(#PB_Any, #PB_Unicode)
      
      If \hXML
        
        \hRootNode = RootXMLNode(\hXML)
        \hMainNode = CreateXMLNode(\hRootNode)
        
        SetXMLNodeText(CreateXMLNode(\hRootNode, 0, #PB_XML_Comment), "gwcore preference file, manual editing can cause instability and crashes")
        
        SetXMLNodeName(\hMainNode, "gwcore")
        
        GWCoreOptionSave()
        
      EndIf
      
    EndIf
    
    ProcedureReturn \hXML
    
  EndWith
  
EndProcedure

Procedure.l GWCoreOptionGetModuleNode(sModule.s, bCreate.b = #False)
  
  Shared uGWCoreOption
  
  Protected lReturn.l = #Null, *lNode.l, lNode.l
  
  With uGWCoreOption 
    
    If \hXML
      
      Repeat
        
        lNode + 1
        
        *lNode = XMLNodeFromPath(\hMainNode, "module[" + Str(lNode) + "]")
        
        If *lNode And GetXMLAttribute(*lNode, "name") = sModule
          
          lReturn = *lNode
          
          Break
          
        EndIf
        
      Until Not *lNode
      
      If Not lReturn And bCreate
        
        lReturn = CreateXMLNode(\hMainNode)
        SetXMLNodeName(lReturn, "module")
        SetXMLAttribute(lReturn, "name", sModule)
        
        GWCoreOptionSave()
        
      EndIf
      
    EndIf
    
  EndWith
  
  ProcedureReturn lReturn
  
EndProcedure

Procedure.b GWCoreOptionSetValueS(sModule.s, sName.s, sValue.s)
  
  Protected bReturn.b = #False, *lMainNode.l, *lNode.l
  
  *lMainNode = GWCoreOptionGetModuleNode(sModule)
  
  If *lMainNode
    
    *lNode = XMLNodeFromPath(*lMainNode, sName)
    
    If Not *lNode
      
      *lNode = CreateXMLNode(*lMainNode)
      SetXMLNodeName(*lNode, sName)
      
    EndIf
    
    If *lNode
      
      SetXMLNodeText(*lNode, sValue)
      
      GWCoreOptionSave()
      
      bReturn = #True
      
    EndIf
    
  EndIf
  
  ProcedureReturn bReturn
  
EndProcedure


GWCoreOptionInit()


OpenLibrary(0, "test.dll")
CallFunction(0, "test", @GWCoreOptionSetValueS())


Delay(1000)
CloseLibrary(0)
test.dll

Code: Alles auswählen

Prototype.b GWCoreOptionSetValueS(sModule.s, sName.s, sValue.s)
Global GWCoreOptionSetValueS.GWCoreOptionSetValueS

EnableExplicit

Procedure Thread(lDummy.l)
  
  GWCoreOptionSetValueS("gwpp", "load", "true")
  
EndProcedure

ProcedureDLL.l test(hProc.l)
  
  GWCoreOptionSetValueS = hProc
  
  ;CreateThread_(0, 0, @Thread(), 0, 0, 0)
  CreateThread(@Thread(), 0)
  
  Delay(100)
  
  ProcedureReturn #True
  
EndProcedure
Ich hasse Fehler die ich mir nicht auf anhieb erklären kann, meist wegen einer wissenslücke oder einem logikfehler :freak:
Nextgen Guild Wars Fanseite: Guild Wars Tactics (Pseudo-Admin + Developer)
"Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht." - Unbekannter Autor
Antworten