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
