[PROJEKT] Patch Maker - erstellen Patch File für Anwendungen z.b.

Anfängerfragen zum Programmieren mit PureBasic.
Axolotl
Beiträge: 266
Registriert: 31.12.2008 16:34

Re: [PROJEKT] Patch Maker - erstellen Patch File für Anwendungen z.b.

Beitrag von Axolotl »

Also, meine Empfehlung ist jetzt (nur für Dich):

1. Setze unter Compiler - Standards den Haken bei [X] Temporäres Executable im Quellcode-Verzeichnis einstellen.
Dann befindet sich die ausführbare Datei immer im gleichen Verzeichnis.

2. Kopiere alle benötigten Dateien in dieses Quellcode-Verzeichnis.

3. Kopiere dir die folgende kleine Procedure in eine deiner Quellcode Dateien.

Code: Alles auswählen

; 
Procedure.s ProgramFilePath()  
  ProcedureReturn GetPathPart(ProgramFilename()) 
EndProcedure 
4. Rufe jede der (benötigten) Dateien mit diesem Pfad auf.

Code: Alles auswählen

; 
Global g_LibFileName$ = ProgramFilePath() + "<NameOfLib>"
Hinweis.
1. Beachte, dass du jetzt immer alle (benötigten) Dateinen mit der ausführbaren Datei zusammne verschiebst.
2. Wenn die benötigten Dateien in einem Unterverzeichnis bspw. ".\Data" oder ".\Images" oder, oder oder, liegen mußt du natürlich den Pfad anpassen.

Code: Alles auswählen

; 
Global g_ImageFileName$ = ProgramFilePath() + "Images\<NameOfImage>"
Using PureBasic latest stable version and current alpha/beta (x64) on Windows 11 Home
Benutzeravatar
ChrigiGee
Beiträge: 125
Registriert: 18.07.2024 12:14
Computerausstattung: Lenovo ThinkPad i7, 32GB Ram, 1TB SSD
PB 6.11 LTS, proGUI, IceDesigner
Wohnort: Bern

Re: [PROJEKT] Patch Maker - erstellen Patch File für Anwendungen z.b.

Beitrag von ChrigiGee »

Hallo axolotl,

scheint wohl etwas anspruchsvoller zu sein die Problematik.

die Auswertung debug ergibt:
C:\Users\meandmyself\Documents\my Basic\PureBasic\user\listviewdll\Listview.dll
0
CurrentDirectory: C:\Users\meandmyself\Documents\my Basic\PureBasic\user\listviewdll\

Code: Alles auswählen

Debug  g_LibFileName$
Debug ProgramFilePath() + "Listview.dll"
Debug OpenLibrary(#Library, "Listview.dll")
Debug #Library
Debug "CurrentDirectory: " + GetCurrentDirectory() 
Sobald die lib durch den entsprechenden Bereich geht und hier ankommt:

Code: Alles auswählen

   Global HeaderToCsv.pHeaderToCsv = GetFunction(#Library, "HeaderToCsv")
   Global SearchBlankItem.pSearchBlankItem = GetFunction(#Library, "SearchBlankItem")
Else
Debug "CurrentDirectory: " + GetCurrentDirectory() 
  MessageRequester("Fehler", "Library nicht gefunden", 0)
  End
EndIf
Bricht das Ganze in dem Sinne mit entsprechendem Fehler ab.

Ich bin nicht sicher, ob zu Beginn #Library = 0 ein Fehler ist und
ob es aus dem Grund zum Fehler kommt.
Wenn ich hingegen auf #PB_Any
ändere bleibt das ganze unverändert, der Fehler bleibt bestehen.

Zur Zeit bin ich am suchen in der Include Datei wo wahrscheinlich
das Problem liegt.


ListviewP.pbi :

Code: Alles auswählen

; Funktionen für Listview.dll
; als Prototype deklariert

#Library = 0
Global lview.l, value.l, text.s


; 
Procedure.s ProgramFilePath()  
  ProcedureReturn GetPathPart(ProgramFilename()) 
EndProcedure 

Global g_LibFileName$ = ProgramFilePath() + "Listview.dll"
Debug  g_LibFileName$ +""+ "" +  ProgramFilePath() + "Listview.dll"

; lview = OpenLibrary(#Library, "./Listview.dll")
OpenLibrary(#Library, "Listview.dll")
Debug OpenLibrary(#Library, "Listview.dll")
Debug #Library

Prototype pCreateListview(f.l, i.l, t.l, h.l, g.l, s.l)
Prototype pIColumn(h.l, t.l, b.l, f.l)
Prototype pSItem(h.l, b.l, a.l)
Prototype pShowListview(ha.l, x.l, y.l, b.l, h.l)
Prototype pInitMessages(h.l)
Prototype pASortListview(h.l, b.l, a.l)
Prototype pAddItemValues(lv.l, s.l, b.l, a.l)
Prototype pCheckIfMarked(lv.l)
Prototype pMarkIfChecked(lv.l)
Prototype pReadFileQuick(s.l, b.l, o.l, a.l)
Prototype pWriteFileQuick(s.l, b.l, o.l, a.l)
Prototype pSwapLines(b.l, a.l, f.l)
Prototype pCsvToListview(h.l, b.l, a.l, s.l)
Prototype pListviewToCsv(h.l, b.l, a.l, f.l)
Prototype pSetItemsFromMem(h.l, b.l, a.l, s.l)
Prototype pGetColumns(h.l)
Prototype pGetColumnName(lv.l, b.l, s.l)
Prototype pGetLines(h.l)
Prototype pGetSelected(bt.l, bl.l)
Prototype pGetSelectedDbClk(bt.l, bl.l)
Prototype pGetAllSelected(bt.l, bl.l)
Prototype pGetNeededMemory(h.l, f.l)
Prototype pGetTabOffsets(bt.l, bo.l)
Prototype pGetNullOffset(b.l)
Prototype pGetOwnControlParas(b.l, h.l, s.l, z.l)
Prototype pGetRealColumnIndex(lv.l, s.l)
Prototype pCreateImageList(f.l, b.l)
Prototype pDestroyImageList(i.l)
Prototype pSetImageList(h.l, i.l)
Prototype pSetIcon(h.l, z.l, n.l)
Prototype pSetIconMode(f.l)
Prototype pSetIconColumn(s.l)
Prototype pSetIconsFromMem(h.l, z.l, b.l, a.l)
Prototype pSetIconsWith(h.l, z.l, n.l, a.l)
Prototype pSetIndex(i.l)
Prototype pGetSelectedLine(h.l)
Prototype pGetColumnWidth(h.l, i.l)
Prototype pCryptMem(b.l, a.l, s.l, l.l)
Prototype pSetColumnsFromMem(h.l, b.l, o.l)
Prototype pSetColumnName(lv.l, b.l, s.l)
Prototype pCloseMessages(f.l)
Prototype pDbfToCsv(b.l, a.l, s.l, z.l, f.l)
Prototype pSelectLine(h.l, i.l, f.l)
Prototype pSetAllCheckboxStates(lv.l, b.l)
Prototype pDeleteDoubleItems(lv.l, s.l)
Prototype pEnableEdits(lv.l, fl.l)
Prototype pListviewToDbf(lv.l, ber.l, vb.l, fl.l)
Prototype pSetCheckboxState(lv.l, index.l, mode.l)
Prototype pGetCheckboxState(lv.l, index.l)
Prototype pGetAllCheckboxStates(H.l, B.l)   
Prototype pGetChecked(p1.l, p2.l, p3.l)
Prototype pSearchText(lv.l, start.l, ende.l, spalte.l, sstr.l, flag.l, espalte.l)
Prototype pSelectColumnEdits(lv.l, b.l)
Prototype pExchangeSeparator(ber.l, anzb.l, ascz.l, ersatz.l, f.l)
Prototype pCopyLineTo(qlv.l, zlv.l, qindex.l, zindex.l)
Prototype pCopyColumnTo(qlv.l, zlv.l, qindex.l, zindex.l)
Prototype pSortManual(h.l, i.l, f.l)
Prototype pFilelistToCsv(n.l, b.l, s.l, z.l, f.l, i.l)
Prototype pSetItemText(h.l, t.l, s.l, i.l)
Prototype pGetItemText(h.l, b.l, s.l, i.l)
Prototype pGetItemTextsAsFloat(lv.l, s.l, b.l)
Prototype pGetItemTextsAsInteger(lv.l, s.l, b.l)
Prototype pExamineColumn(h.l, s.l)
Prototype pSetColumnSort(h.l, s.l, f.l)
Prototype pGetColumnUpdate(h.l, b.l)
Prototype pRaiseColumns(h.l, b.l, s.l, g.l)
Prototype pRaiseLine(lv.l, l.l, s.l, g.l)
Prototype pMixRGB(f1.l, f2.l)
Prototype pSetBackImage(h.l, n.l, f.l)
Prototype pPrintListview(h.l, w.l, i.l, s.l, l.l, o.l, r.l, u.l, ps.l, pz.l, us.l, n.l, f.l)
Prototype pPrintColumns(b.l)
Prototype pAreCheckboxesPresent(h.l)
Prototype pEraseListview(h.l)
Prototype pGetControlParas(b.l)
Prototype pRegister(k.l)
Prototype pSetFilelistFilter(s.l)
Prototype pSetFilelistNoFilter(s.l)
Prototype pEnableDragDrop(lv.l, f.l)
Prototype pGetDragDropParas(b.l)
Prototype pSetStyle(s.l)
Prototype pGetVar(f.l)
Prototype pGetEdgeIntegers(b.l, a.l, l.l, h.l)
Prototype pGetEdgeFloats(b.l, a.l, l.f, h.f)
Prototype pGetIcon(lv.l, s.l, z.l)
Prototype pAreIconsPresent(H.l)
Prototype pSetColumnAlignment(lv.l, s.l, a.l)
Prototype pSetLineNumbers(lv.l, a.l, s.l)
Prototype pGetDllVersion()
Prototype pDeleteSpaceLines(lv.l, f.l)
Prototype pGetIndex()
Prototype pConvertDatas(lv.l, s.l, f.l)
Prototype pForbidScrollMessage(lv.l)
Prototype pExchangeBytes(lv.l, s.l, q.l, z.l)
Prototype pSetPrintAttributes(F.l, p1.l, p2.l, p3.l, p4.l)
Prototype pSetColumnsWidthLimits(L.l, H.l) 
Prototype pSetLineHeight(lv.l, y.l)
Prototype pGetLastKey(L.l,T.l) 
Prototype pListviewToRaw(H.l,B.l) 
Prototype pRawToListview(H.l, B.l)
Prototype pSetItemTextEx(H.l,T.l,S.l,L.l,A.l)
Prototype pGetItemTextEx(H.l,B.l,S.l,L.l,A.l) 
Prototype pBuildListview(H.l,S.l,L.l,B.l,T.l) 
Prototype pClearListview(H.l) 
Prototype pEditManual(H.l,S.l,Z.l,F.l) 
Prototype pCsvToHeader(H.l, B.l, O.l)
Prototype pDeleteAllItems(H.l)
Prototype pDeleteColumn(H.l, I.l)
Prototype pDeleteItem(H.l, I.l)
Prototype pGetItemState(lv.l, index.l, status.l)
Prototype pGetSelectedCount(lv.l)
Prototype pUpdateListview(H.l)
Prototype pGetLineText(h.l, i.l, b.l)
Prototype pSetColumnUpdate(H.l, B.l)
Prototype pHeaderToCsv(H.l, B.l, A.l, F.l)
Prototype pSearchBlankItem(H.l, S.l, L.l)

If IsLibrary(#Library)
   Global CreateListview.pCreateListview = GetFunction(#Library, "CreateListview")
   Global IColumn.pIColumn = GetFunction(#Library, "IColumn")
   Global SItem.pSItem = GetFunction(#Library, "SItem")
   Global ShowListview.pShowListview = GetFunction(#Library, "ShowListview")  
   Global InitMessages.pInitMessages = GetFunction(#Library, "InitMessages")
   Global ASortListview.pASortListview = GetFunction(#Library, "ASortListview")
   Global AddItemValues.pAddItemValues = GetFunction(#Library, "AddItemValues")
   Global CheckIfMarked.pCheckIfMarked = GetFunction(#Library, "CheckIfMarked")
   Global MarkIfChecked.pMarkIfChecked = GetFunction(#Library, "MarkIfChecked")
   Global ReadFileQuick.pReadFileQuick = GetFunction(#Library, "ReadFileQuick")
   Global WriteFileQuick.pWriteFileQuick = GetFunction(#Library, "WriteFileQuick")
   Global SwapLines.pSwapLines = GetFunction(#Library, "SwapLines")
   Global CsvToListview.pCsvToListview = GetFunction(#Library, "CsvToListview")
   Global ListviewToCsv.pListviewToCsv = GetFunction(#Library, "ListviewToCsv")                
   Global SetItemsFromMem.pSetItemsFromMem = GetFunction(#Library, "SetItemsFromMem")
   Global GetColumns.pGetColumns = GetFunction(#Library, "GetColumns")
   Global GetColumnName.pGetColumnName = GetFunction(#Library, "GetColumnName")
   Global GetLines.pGetLines = GetFunction(#Library, "GetLines")
   Global GetSelected.pGetSelected = GetFunction(#Library, "GetSelected")
   Global GetSelectedDbClk.pGetSelectedDbClk = GetFunction(#Library, "GetSelectedDbClk")
   Global GetAllSelected.pGetAllSelected = GetFunction(#Library, "GetAllSelected")
   Global GetAllCheckboxStates.pGetAllCheckboxStates = GetFunction(#Library, "GetAllCheckboxStates")
   Global GetNeededMemory.pGetNeededMemory = GetFunction(#Library, "GetNeededMemory")
   Global GetTabOffsets.pGetTabOffsets = GetFunction(#Library, "GetTabOffsets")
   Global GetNullOffset.pGetNullOffset = GetFunction(#Library, "GetNullOffset")
   Global GetOwnControlParas.pGetOwnControlParas = GetFunction(#Library, "GetOwnControlParas")
   Global GetRealColumnIndex.pGetRealColumnIndex = GetFunction(#Library, "GetRealColumnIndex")
   Global CreateImageList.pCreateImageList = GetFunction(#Library, "CreateImageList")
   Global SetImageList.pSetImageList = GetFunction(#Library, "SetImageList")
   Global SetIcon.pSetIcon = GetFunction(#Library, "SetIcon")
   Global SetIconMode.pSetIconMode = GetFunction(#Library, "SetIconMode")
   Global SetIconColumn.pSetIconColumn = GetFunction(#Library, "SetIconColumn")
   Global SetIconsFromMem.pSetIconsFromMem = GetFunction(#Library, "SetIconsFromMem")
   Global SetIconsWith.pSetIconsWith = GetFunction(#Library, "SetIconsWith")
   Global SetIndex.pSetIndex = GetFunction(#Library, "SetIndex")
   Global SetColumnsWidthLimits.pSetColumnsWidthLimits = GetFunction(#Library, "SetColumnsWidthLimits")
   Global GetSelectedLine.pGetSelectedLine = GetFunction(#Library, "GetSelectedLine")
   Global GetColumnWidth.pGetColumnWidth = GetFunction(#Library, "GetColumnWidth")
   Global CryptMem.pCryptMem = GetFunction(#Library, "CryptMem")
   Global SetColumnsFromMem.pSetColumnsFromMem = GetFunction(#Library, "SetColumnsFromMem")
   Global SetColumnName.pSetColumnName = GetFunction(#Library, "SetColumnName")
   Global CloseMessages.pCloseMessages = GetFunction(#Library, "CloseMessages")
   Global DbfToCsv.pDbfToCsv = GetFunction(#Library, "DbfToCsv")
   Global SelectLine.pSelectLine = GetFunction(#Library, "SelectLine")
   Global SetAllCheckboxStates.pSetAllCheckboxStates = GetFunction(#Library, "SetAllCheckboxStates")
   Global DeleteDoubleItems.pDeleteDoubleItems = GetFunction(#Library, "DeleteDoubleItems")
   Global EnableEdits.pEnableEdits = GetFunction(#Library, "EnableEdits")
   Global ListviewToDbf.pListviewToDbf = GetFunction(#Library, "ListviewToDbf")
   Global SetCheckboxState.pSetCheckboxState = GetFunction(#Library, "SetCheckboxState")
   Global GetCheckboxState.pGetCheckboxState = GetFunction(#Library, "GetCheckboxState")
   Global GetChecked.pGetChecked = GetFunction(#Library, "GetChecked")
   Global SearchText.pSearchText = GetFunction(#Library, "SearchText")
   Global SelectColumnEdits.pSelectColumnEdits = GetFunction(#Library, "SelectColumnEdits") 
   Global ExchangeSeparator.pExchangeSeparator = GetFunction(#Library, "ExchangeSeparator")
   Global CopyLineTo.pCopyLineTo = GetFunction(#Library, "CopyLineTo")
   Global CopyColumnTo.pCopyColumnTo = GetFunction(#Library, "CopyColumnTo")
   Global GetIndex.pGetIndex = GetFunction(#Library, "GetIndex")
   Global SortManual.pSortManual = GetFunction(#Library, "SortManual")
   Global FilelistToCsv.pFilelistToCsv = GetFunction(#Library, "FilelistToCsv")
   Global SetItemText.pSetItemText = GetFunction(#Library, "SetItemText")
   Global GetItemText.pGetItemText = GetFunction(#Library, "GetItemText")
   Global GetItemTextsAsFloat.pGetItemTextsAsFloat = GetFunction(#Library, "GetItemTextsAsFloat")
   Global GetItemTextsAsInteger.pGetItemTextsAsInteger = GetFunction(#Library, "GetItemTextsAsInteger")
   Global ExamineColumn.pExamineColumn = GetFunction(#Library, "ExamineColumn")
   Global SetColumnSort.pSetColumnSort = GetFunction(#Library, "SetColumnSort")
   Global GetColumnUpdate.pGetColumnUpdate = GetFunction(#Library, "GetColumnUpdate")
   Global SetColumnUpdate.pSetColumnUpdate = GetFunction(#Library, "SetColumnUpdate")
   Global RaiseColumns.pRaiseColumns = GetFunction(#Library, "RaiseColumns")
   Global RaiseLine.pRaiseLine = GetFunction(#Library, "RaiseLine")
   Global MixRGB.pMixRGB = GetFunction(#Library, "MixRGB")
   Global SetBackImage.pSetBackImage = GetFunction(#Library, "SetBackImage")
   Global PrintListview.pPrintListview = GetFunction(#Library, "PrintListview")
   Global PrintColumns.pPrintColumns = GetFunction(#Library, "PrintColumns")
   Global AreCheckboxesPresent.pAreCheckboxesPresent = GetFunction(#Library, "AreCheckboxesPresent")
   Global AreIconsPresent.pAreIconsPresent = GetFunction(#Library, "AreIconsPresent")
   Global EraseListview.pEraseListview = GetFunction(#Library, "EraseListview")
   Global GetControlParas.pGetControlParas = GetFunction(#Library, "GetControlParas")
   Global Register.pRegister = GetFunction(#Library, "Register")
   Global SetFilelistFilter.pSetFilelistFilter = GetFunction(#Library, "SetFilelistFilter")
   Global SetFilelistNoFilter.pSetFilelistNoFilter = GetFunction(#Library, "SetFilelistNoFilter")
   Global EnableDragDrop.pEnableDragDrop = GetFunction(#Library, "EnableDragDrop")
   Global GetDragDropParas.pGetDragDropParas = GetFunction(#Library, "GetDragDropParas")       
   Global SetStyle.pSetStyle = GetFunction(#Library, "SetStyle")
   Global GetVar.pGetVar = GetFunction(#Library, "GetVar")
   Global GetEdgeIntegers.pGetEdgeIntegers = GetFunction(#Library, "GetEdgeIntegers")
   Global GetEdgeFloats.pGetEdgeFloats = GetFunction(#Library, "GetEdgeFloats")
   Global GetIcon.pGetIcon = GetFunction(#Library, "GetIcon")
   Global SetColumnAlignment.pSetColumnAlignment = GetFunction(#Library, "SetColumnAlignment")
   Global SetLineNumbers.pSetLineNumbers = GetFunction(#Library, "SetLineNumbers")
   Global GetDllVersion.pGetDllVersion = GetFunction(#Library, "GetDllVersion")
   Global DeleteSpaceLines.pDeleteSpaceLines = GetFunction(#Library, "DeleteSpaceLines")
   Global ConvertDatas.pConvertDatas = GetFunction(#Library, "ConvertDatas")
   Global ForbidScrollMessage.pForbidScrollMessage = GetFunction(#Library, "ForbidScrollMessage")
   Global ExchangeBytes.pExchangeBytes = GetFunction(#Library, "ExchangeBytes")
   Global SetPrintAttributes.pSetPrintAttributes = GetFunction(#Library, "SetPrintAttributes")
   Global SetLineHeight.pSetLineHeight = GetFunction(#Library, "SetLineHeight")
   Global GetLastKey.pGetLastKey = GetFunction(#Library, "GetLastKey")
   Global SetColumnsWidthLimits.pSetColumnsWidthLimits = GetFunction(#Library, "SetColumnsWidthLimits")
   Global ListviewToRaw.pListviewToRaw = GetFunction(#Library, "ListviewToRaw")
   Global RawToListview.pRawToListview = GetFunction(#Library, "RawToListview")
   Global SetItemTextEx.pSetItemTextEx = GetFunction(#Library, "SetItemTextEx")
   Global GetItemTextEx.pGetItemTextEx = GetFunction(#Library, "GetItemTextEx") 
   Global BuildListview.pBuildListview = GetFunction(#Library, "BuildListview")
   Global ClearListview.pClearListview = GetFunction(#Library, "ClearListview")
   Global EditManual.pEditManual = GetFunction(#Library, "EditManual")
   Global CsvToHeader.pCsvToHeader = GetFunction(#Library, "CsvToHeader")
   Global HeaderToCsv.pHeaderToCsv = GetFunction(#Library, "HeaderToCsv")
   Global DeleteAllItems.pDeleteAllItems = GetFunction(#Library, "DeleteAllItems")
   Global DeleteColumn.pDeleteColumn = GetFunction(#Library, "DeleteColumn")
   Global DeleteItem.pDeleteItem = GetFunction(#Library, "DeleteItem")
   Global GetItemState.pGetItemState = GetFunction(#Library, "GetItemState")
   Global GetSelectedCount.pGetSelectedCount = GetFunction(#Library, "GetSelectedCount")
   Global UpdateListview.pUpdateListview = GetFunction(#Library, "UpdateListview")
   Global HeaderToCsv.pHeaderToCsv = GetFunction(#Library, "HeaderToCsv")
   Global SearchBlankItem.pSearchBlankItem = GetFunction(#Library, "SearchBlankItem")
Else
Debug "CurrentDirectory: " + GetCurrentDirectory() 
  MessageRequester("Fehler", "Library nicht gefunden",#PB_MessageRequester_Error,0)
  End
EndIf

Procedure DestroyImageList(i.l)
  ImageList_Destroy_(i)
EndProcedure  

Procedure.s GetLineText(h.l, i.l, b.l)
  value = GetFunction(#Library, "GetLineText")
  If value <> 0
     text = PeekS(b)
  Else
     text = ""
  EndIf
  ProcedureReturn text      
EndProcedure
    
Procedure.l GetLVTxtColor(lv.l)
  value = SendMessage_(lv, $1023, 0, 0)
  ProcedureReturn value
EndProcedure

Procedure.l GetLVTxtBKColor(lv.l)
   value = SendMessage_(lv, $1025, 0, 0)
   ProcedureReturn value
EndProcedure

Procedure.l GetLVBKColor(lv.l)
   value = SendMessage_(lv, $1000, 0, 0)
   ProcedureReturn value
EndProcedure
Die Compiler direktive temp Verzeichnis ist Source Verzeichnis
habe ich eigentlich aus solchen Gründen fix.

Dann kann es mir nicht passieren, dass ich auf eine Datei verweise
und sie nicht existiert während dem Testen da Falsches Verzeichnis.

bei der Include Datei wir eigentlich noch nichts von Grafik oder so
benötigt, das einzige wäre besagte dll welche so einfach nicht zu existieren scheint.

Wenn PB an der Strucktur zu viel geändert hätte müsste mir doch der Syntax Check bereits
Probleme Melden, was er auch nicht macht, erst wenn die dll Abfrage den Bereich If IsLibrary(#Library)
durchläuft.

Wenn das mit der Listview.dll so schwierig ist umsetzten zu können.
Werde ich doch versuchen mit den Board Mitteln, "ListIcon"
weiter zu versuchen.

Herzliche Grüsse
Christian
Wer nicht fragt, der nichts lernt.
Wer keine Fehler macht, kann sich nicht verbessern.
Das Mysterium, ein wandelndes Lexikon. :mrgreen:

Wer Fragen zu meinem Textstil hat oder sich wundert über mich,
der darf seelenruhig mich direkt ansprechen. Ich beiße noch nicht.
Axolotl
Beiträge: 266
Registriert: 31.12.2008 16:34

Re: [PROJEKT] Patch Maker - erstellen Patch File für Anwendungen z.b.

Beitrag von Axolotl »

Nun ja,
Wenn du den Text-Cursor auf OpenLibrary() setzt und F1 drückst, siehst du die Hilfe..
Hier steht, dass der rückgabewert bei Erfolg ungleich Null ist.
Und das wiederum liegt eben (meistens) an falschen Pfaden......

Oder; was natürlich auch sein kann:
Die Hilfe schreibt:
Es ist zwingend erforderlich, dass das erstellte PureBasic-Executable und die "shared" Library dieselbe Architektur verwenden (z. B. kann eine x86-DLL nicht von x64-Executables geöffnet werden).

Liegt denn die Listview.dll auch in dem Verzeichnis?

Wenn du die nächste Zeile ausführst, sollte eine Zahl größer 0 da stehen.
Ein Wert von -1 würde dir sagen, dass die Listview.dll hier nicht zu finden ist.

Code: Alles auswählen

Debug FileSize(ProgramFilePath() + "Listview.dll") 
So wie hier macht das (glaube ich) keinen Sinn.

Code: Alles auswählen

; lview = OpenLibrary(#Library, "./Listview.dll")
OpenLibrary(#Library, "Listview.dll")
Debug OpenLibrary(#Library, "Listview.dll")
Debug #Library
Besser mal folgendes anstelle der obigen Zeilen:

Code: Alles auswählen

; lview = OpenLibrary(#Library, "./Listview.dll")
Global ret = OpenLibrary(#Library, g_LibFileName$)
Debug ret 
; Debug #Library ; <== diese Constante ist 0 (siehe oben) 
P.S.: Nach einem kurzen Blick in die Includedatei, befürchte ich, dass dort viele Variablendeklarationen .l nicht mehr funktionieren werden.
Aufgrund der neuen Einstellungen bei PB sind die Bereiche für Handle jetzt immer .i.
Using PureBasic latest stable version and current alpha/beta (x64) on Windows 11 Home
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: [PROJEKT] Patch Maker - erstellen Patch File für Anwendungen z.b.

Beitrag von H.Brill »

Also, ich habe die .pbi und den Beispielcode dazu auch noch in meinen Ordnern gefunden.
Bei mir läuft es (PB 6.10). Ich habe alles unter examples\sources. Dort liegen auch meine ganzen
Quellcodes. Für mich sieht es so aus, als wenn es nur ein Problem mit den Pfaden hier
bei dir gibt.

Die Library kannst du ja auch statt in der .pbi in deinem Programm öffnen.

Code: Alles auswählen

Global lview.l
#Library = 0
lview = OpenLibrary(#Library, "Listview.dll")
IncludeFile "ListviewP.pbi"
In der .pbi steht vor den Prototypes nur noch das :

Code: Alles auswählen

Global value.l, text.s
Läuft auch so rum.

Die DLL muß ja nur vor dem Includieren der .pbi geöffnet werden, da ja in der selben
Gebrauch davon gemacht wird (IsLibrary() GetFunction() )
PB 6.10
Benutzeravatar
ChrigiGee
Beiträge: 125
Registriert: 18.07.2024 12:14
Computerausstattung: Lenovo ThinkPad i7, 32GB Ram, 1TB SSD
PB 6.11 LTS, proGUI, IceDesigner
Wohnort: Bern

Re: [PROJEKT] Patch Maker - erstellen Patch File für Anwendungen z.b.

Beitrag von ChrigiGee »

Hallo und einen speziell schönen Morgen,

Lieber H. Brill, ich glaube, DU hast die Lösung.
Ich versuche mal aber zuerst einen Hinweis dazu.

Meine Originaldatei pbi hatte das Verzeichnis als Standard
bei der Compiler Option.

Bild
https://imgsh.net/i/f0777cb05b
Die DLL muß ja nur vor dem Includieren der .pbi geöffnet werden, da ja in der selben
Gebrauch davon gemacht wird (IsLibrary() GetFunction() )
Ich habe die ganze Zeit mit dem Problem bei der pbi gesucht.
Diese jedoch voraussetzt, die geladene dll, was in der pbi wahrscheinlich nicht der Fall war.
Sondern in der Main Anwendung.

Danke, dass DU rascher gewesen bist mit Antworten als ich langsamer Schweizer.

Herzliche Grüsse
Christian
Wer nicht fragt, der nichts lernt.
Wer keine Fehler macht, kann sich nicht verbessern.
Das Mysterium, ein wandelndes Lexikon. :mrgreen:

Wer Fragen zu meinem Textstil hat oder sich wundert über mich,
der darf seelenruhig mich direkt ansprechen. Ich beiße noch nicht.
Benutzeravatar
ChrigiGee
Beiträge: 125
Registriert: 18.07.2024 12:14
Computerausstattung: Lenovo ThinkPad i7, 32GB Ram, 1TB SSD
PB 6.11 LTS, proGUI, IceDesigner
Wohnort: Bern

Re: [PROJEKT] Patch Maker - erstellen Patch File für Anwendungen z.b.

Beitrag von ChrigiGee »

Hallo @all,

Ein dickes Dankeschön an H. Brill, mit dem Laden der dll.
Ein Dankeschön an das mit den Pfaden von Euch allen.

Speziell, was ich die ganze Zeit übersehen habe.
Die dll ist wirklich eine 32 bit dll.

Ich hingegen die ganze Zeit mit dem 64 bit Compiler am Werkeln.
Blind im Gedanken auch an Pfade welche nicht gelesen werden können
C:\Users\ich und mein selbst\documents\mein basic source\bla bla bla
In dem Fall war wirklich alles bei mir falsch.....
Das Verzeichnis existierte nicht, was zum Fehler beigetragen hatte zu Beginn.
Die Blindheit, dass ich 64bit Compiler verwende und die dll 32 bit ist.

Und meiner Aufmerksamkeit der letzten Tage geschuldet, dass ich Eure Ratschläge nicht verarbeiten konnte.
Ich die ganze Zeit von A nach Z wollte.


Wirklich Euch allen, ein riesiges großes Dankeschön, auch wenn es den Eindruck erweckt, dass man mir 100-mal das Gleiche sagt.
Die Informationen und Ratschläge kommen nicht immer dort an, wo sie hinsollten und erst Tage später macht, es klick.

Mal schauen ob ich so der Lösung etwas weiter komme,
Anbetracht Patch Maker resp. Eure Vorschläge Auto Update per Internet.

JETZT sind beide Optionen angekommen und ich versuche beides in Einklang zu bekommen.


Herzliche Grüsse
Christian
Wer nicht fragt, der nichts lernt.
Wer keine Fehler macht, kann sich nicht verbessern.
Das Mysterium, ein wandelndes Lexikon. :mrgreen:

Wer Fragen zu meinem Textstil hat oder sich wundert über mich,
der darf seelenruhig mich direkt ansprechen. Ich beiße noch nicht.
Benutzeravatar
jacdelad
Beiträge: 404
Registriert: 03.02.2021 13:39
Wohnort: Riesa
Kontaktdaten:

Re: [PROJEKT] Patch Maker - erstellen Patch File für Anwendungen z.b.

Beitrag von jacdelad »

H.Brill hat geschrieben: 12.12.2024 18:34 Hatte ich auch schon gemacht : bei bplaced hochgeladen (per FTP mit Filezilla oder auch vom Programm aus) und wieder
per FTP runtergeladen. FTP kann ja Purebasic auch, da dürfte es keine Probleme geben. Mußt halt die URL in deinem Programm
fest verankern. Und wie jacdelad schon schrieb, eine kleine Textdatei mit den Änderungen dazu legen.
Entweder machst du dir so eine Art Versionsverwaltung oder bietest deine Updates generell zum Download an. Dann kann der Anwender
deiner Software entscheiden, ob er das Update will oder nicht.
Sorry, dass ich hier nochmal ein paar Tage zurückspringe. Ich möchte an der Stelle nur anmerken, dass ich das Runterladen im fertigen Programm per http realisiert habe. Bei FTP muss man die Zugangsdaten im Programm hinterlegen, das halte ich nicht für günstig.
Guten Morgen, das ist ein schöner Tnetennba!

PureBasic 6.21/Windows 11 x64/Ryzen 7900X/32GB RAM/3 TB SSD
Synology DS1821+/DX517, 130.9TB+50.8TB+2TB SSD
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: [PROJEKT] Patch Maker - erstellen Patch File für Anwendungen z.b.

Beitrag von H.Brill »

Eines wollte ich dir noch sagen :
Ich hatte es weiter oben schon mal angedeutet. Ein Patchmaker hilft nur, wenn du eigene Funtkionen
manipulieren bzw. erweitern willst. Sobald aber neue Elemente für die GUI hinzu kommen sollten, wird
das nicht mehr gehen. Der Hintergrund ist halt der, daß der Compiler feste Funktionsadressen deiner
Proceduren in der .exe erstellt. Bei den GUI - Elementen sieht das anders aus. Da vergibt Windows beim
Start deines Programmes Handles für deine Fenster und Gadgets. Und am Programmende wird halt wieder
aufgeräumt und diese Handles wieder freigegeben. Und so, wie in der .exe ist es auch fast ähnlich bei der
DLL. Zusätzlich werden bei der DLL noch die Funktionsnamen exportiert.
So kannst du mal die Funktionsnamen der Listview.dll erkunden :

Code: Alles auswählen

If OpenLibrary(0, "F:\Listview.dll")
   If ExamineLibraryFunctions(0)
     While NextLibraryFunction()
       Debug "Adresse : " + LibraryFunctionAddress()  + "   Name : " + LibraryFunctionName()
     Wend
     
   EndIf  
   CloseLibrary(0)
EndIf  
Bei mehrmaligem Aufruf wirst du feststellen, daß die Funktionsadressen immer gleich bleiben.

Solche Patches kenne ich auch von XProfan. RGH, der Autor, bietet diese als Download an, wenn er eine
Fehlerbereinigung oder Neuerungen in seinen Funktionen / Befehlen gemacht hat. Mit den festen Funktionasdressen
hat er dann seine Offsets, wo er den Dateizeiger draufsetzt und dann den neuen compilierten Bytecode reinschreiben
kann. Wenn er nun aber etwas an den GUI - Sachen ändern will, wo Windows erst zur Laufzeit die Handles liefert,
schickt er keinen Patch, sondern die neuen Versionen von Profan.exe (Interpreter) und Runtime (Prfrun32.exe).

So ist mal meine Auffassung bzw. mein Wissen dazu.
PB 6.10
Benutzeravatar
ChrigiGee
Beiträge: 125
Registriert: 18.07.2024 12:14
Computerausstattung: Lenovo ThinkPad i7, 32GB Ram, 1TB SSD
PB 6.11 LTS, proGUI, IceDesigner
Wohnort: Bern

Re: [PROJEKT] Patch Maker - erstellen Patch File für Anwendungen z.b.

Beitrag von ChrigiGee »

Hallo und einen wunderschönen Sonntag "Abend",

Ich hoffe, ich bekomme nicht zu große Schelte, bei dieser Frage.
Ich habe den ganze Freitagabend und Samstag damit verbracht.

GUI zuerst mit IceDesign schaut ok aus, der Source ist etwa
zu kompliziert geraten, um nachträglich etwas anpassen zu wollen.

Also hab ich die Boardmittel genommen, was mich auch net befriedigte.
Wenn die internen Designer etwas nicht passt, am Source wird alles
nach SEINEN Wünschen geändert.

Also doch soviel ich konnte von Hand, Kopie vom Internen in einem neuen pb File.

Ich verzweifle momentan daran, eigentlich hätte ich ein normales Menü,
Zwei Container.
Der zweite meine Liste des Verzeichnisses beinhaltet momentan mit ListIconView.
Soweit die Theorie auch klappte.

Sobald ich hingegen ein PopUpMenü möchte für den Container 2 und ausschließlich für das ListIconView
schmiert mir die ganze Theorie, ab in der Praxis.

Entweder hab ich keine Menüs oder es startet das Fenster bereits nicht.

Die Hilfe hab ich wie gesagt die letzten Tage queer gelesen, alles was zum Problem passt.
Hilfe Funktion PB.


Es sollte doch möglich sein, dass ausschließlich für das ListView ein PopUp besteht und nicht im gesamten Fenster.
Oder habe ich bereist einen Fehler mit den Containern begangen?

Ich stehe nach 2 Tagen etwas auf dem Schlauch und verstehe nicht, was ich falsch verstanden habe.

Beispiele einzeln, PopUp oder einzeln mein Fenster klappen.
Möchte ich das jedoch irgendwie zusammenbringen, komme ich nicht von Fleck.

Den Source den ich hier habe, ist noch nicht so wie ich es mir Vorstelle,
ich weiß, dass ich noch einiges daran ändern muss, auch an der Übersichtlichkeit
und verstehen, was ich genau machen will.

Herzlichen Dank für das Anscheuen
Christian

Code: Alles auswählen

;
; This code is automatically generated by the Form Designer.
; Manual modification is possible to adjust existing commands, but anything else will be dropped when the code is compiled.
; Event procedures need to be put in another source file.
;

Enumeration FormWindow
  #Window_0
EndEnumeration

Enumeration FormGadget
  #Container_0
  #Text_0
  #Text_4
  #Text_6
  #Editor_0
  #Editor_5
  #Date_0
  #Container_2
  #ListIcon_0
EndEnumeration

Enumeration FormMenu
  #MenuItem_2
  #MenuItem_3
  #MenuItem_5
  #MenuItem_6
  #MenuItem_8
  #MenuItem_10
  #MenuItem_12
  #MenuItem_13
  #MenuItem_14
  #MenuItem_16
  EndEnumeration
  
Enumeration PopUpMenu  
  #PopUpMenuItem_1
  #PopUpMenuItem_2
  #PopUpMenuItem_3
  #PopUpMenuItem_4
  #PopUpMenuItem_5
EndEnumeration

Enumeration FormFont
  #Font_Window_0_0
EndEnumeration

LoadFont(#Font_Window_0_0,"Antigone Pro Light", 12)

;Procedure CreatePopupMenu_0()
 ;If CreatePopupMenu(0)
;  MenuItem(#PopUpMenuItem_1, "EIN")
;  MenuItem(#PopUpMenuItem_2, "ZWEI")
;  MenuItem(#PopUpMenuItem_3, "dREI")
;  MenuBar()
;  MenuItem(#PopUpMenuItem_4, "VIER")
;  MenuItem(#PopUpMenuItem_5, "FüNF")
; EndIf
;EndProcedure
  
Procedure OpenWindow_0(x, y, width = 750, height = 380)
OpenWindow(#Window_0,x,y, 750 ,390, "Patch Maker & Auto UpDate", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered | #PB_Window_WindowCentered)

  CreateMenu(0, WindowID(#Window_0))
  MenuTitle("&Datei")
  MenuItem(#MenuItem_2, "&Neu")
  MenuItem(#MenuItem_3, "&Öffnen")
  MenuBar()
  MenuItem(#MenuItem_5, "&Speichern")
  MenuItem(#MenuItem_6, "Speichern &unter")
  MenuBar()
  MenuItem(#MenuItem_8, "&Beenden")
  MenuTitle("&?")
  MenuItem(#MenuItem_10, "&Hilfe")
  MenuBar()
  MenuItem(#MenuItem_12, "Anpassungen")
  MenuItem(#MenuItem_13, "Danksagung")
  MenuItem(#MenuItem_14, "Rechtliches")
  MenuBar()
  MenuItem(#MenuItem_16, "&Über")

CreatePopupMenu(0)
  MenuItem(#PopUpMenuItem_1, "EIN")
  MenuItem(#PopUpMenuItem_2, "ZWEI")
  MenuItem(#PopUpMenuItem_3, "dREI")
  MenuBar()
  MenuItem(#PopUpMenuItem_4, "VIER")
  MenuItem(#PopUpMenuItem_5, "FüNF")

  ContainerGadget(#Container_0, 10, 0, 720, 50, #PB_Container_Flat | #PB_Container_Raised)
  TextGadget(#Text_0, 10, 10, 70, 25, "Projekt:")
  SetGadgetFont(#Text_0, FontID(#Font_Window_0_0))
  TextGadget(#Text_4, 270, 10, 70, 25, "Version:")
  SetGadgetFont(#Text_4, FontID(#Font_Window_0_0))
  TextGadget(#Text_6, 470, 10, 60, 25, "Datum:")
  SetGadgetFont(#Text_6, FontID(#Font_Window_0_0))
  EditorGadget(#Editor_0, 80, 10, 180, 25, #PB_Editor_ReadOnly)
  SetGadgetFont(#Editor_0, FontID(#Font_Window_0_0))
  AddGadgetItem(#Editor_0, -1, "Projekt Name")
  EditorGadget(#Editor_5, 340, 10, 120, 25, #PB_Editor_ReadOnly)
  SetGadgetFont(#Editor_5, FontID(#Font_Window_0_0))
  AddGadgetItem(#Editor_5, -1, "Projekt Version")
  DateGadget(#Date_0, 540, 10, 170, 25, "")
  SetGadgetFont(#Date_0, FontID(#Font_Window_0_0))
  CloseGadgetList()
  ContainerGadget(#Container_2, 10, 70, 720, 250, #PB_Container_Flat | #PB_Container_Raised)
  ListIconGadget(#ListIcon_0, 10, 10, 700, 230, "Datei", 100, #PB_ListIcon_FullRowSelect)
  AddGadgetColumn(#ListIcon_0, 1, "Verzeichnis", 100)
  AddGadgetColumn(#ListIcon_0, 2, "Optionen", 100)
  CloseGadgetList()
;EndIf
EndProcedure

Procedure Window_0_Events(event)
;Repeat

Select WaitWindowEvent()

    Case #PB_Event_Menu
      Select EventMenu()
        Case #MenuItem_2
        Case #MenuItem_3
        Case #MenuItem_5
        Case #MenuItem_6
        Case #MenuItem_8
        Case #MenuItem_10
        Case #MenuItem_12
        Case #MenuItem_13
        Case #MenuItem_14
        Case #MenuItem_16
      EndSelect  
        
    Case #PB_Event_Gadget
    
 ;          If EventGadget() = 0 And EventType() = #PB_EventType_RightClick
;          DisplayPopupMenu(0, WindowID(0))
;          CreateMenu(0, WindowID(0))
;        EndIf

      Select EventGadget()
;      EndSelect
      
;      Case #PB_Event_Menu
;       Select EventMenu()  ; To see which menu has been selected
      
;        Case #PopUpMenuItem_1
;        MessageRequester("PureBasic", "EIN", 0)

;        Case #PopUpMenuItem_2
;        MessageRequester("PureBasic", "ZWEI", 0)


;        Case #PopUpMenuItem_3
;        MessageRequester("PureBasic", "REI", 0)


;        Case #PopUpMenuItem_4
;        MessageRequester("PureBasic", "VIER", 0)


;        Case #PopUpMenuItem_5
;        MessageRequester("PureBasic", "FüNF", 0)
      EndSelect
      
      Case #PB_Event_CloseWindow
        Quit = 1
      EndSelect
  Repeat
  Until Quit = 1

;EndIf
EndProcedure
End
Wer nicht fragt, der nichts lernt.
Wer keine Fehler macht, kann sich nicht verbessern.
Das Mysterium, ein wandelndes Lexikon. :mrgreen:

Wer Fragen zu meinem Textstil hat oder sich wundert über mich,
der darf seelenruhig mich direkt ansprechen. Ich beiße noch nicht.
Benutzeravatar
ChrigiGee
Beiträge: 125
Registriert: 18.07.2024 12:14
Computerausstattung: Lenovo ThinkPad i7, 32GB Ram, 1TB SSD
PB 6.11 LTS, proGUI, IceDesigner
Wohnort: Bern

Re: [PROJEKT] Patch Maker - erstellen Patch File für Anwendungen z.b.

Beitrag von ChrigiGee »

Hallo jacdelad,

das ist nachvollziehbar, das würde eine Türe öffnen, welche man nicht möchte.
Http ist dabei die eher praktikablere Lösung.

Ist mit der ÜBERLEGUNG besser UpDate per Internet dann nun auch der Grund,
dass ich beides versuche, in Einklang bringen zu können.

Patch Maker oder auch gleich UpDate per Internet.

Herzlichen Dank für deine erweiterte Rückmeldung dazu.
Christian

jacdelad hat geschrieben: 14.12.2024 08:41
H.Brill hat geschrieben: 12.12.2024 18:34 Hatte ich auch schon gemacht : bei bplaced hochgeladen (per FTP mit Filezilla oder auch vom Programm aus) und wieder
per FTP runtergeladen. FTP kann ja Purebasic auch, da dürfte es keine Probleme geben. Mußt halt die URL in deinem Programm
fest verankern. Und wie jacdelad schon schrieb, eine kleine Textdatei mit den Änderungen dazu legen.
Entweder machst du dir so eine Art Versionsverwaltung oder bietest deine Updates generell zum Download an. Dann kann der Anwender
deiner Software entscheiden, ob er das Update will oder nicht.
Sorry, dass ich hier nochmal ein paar Tage zurückspringe. Ich möchte an der Stelle nur anmerken, dass ich das Runterladen im fertigen Programm per http realisiert habe. Bei FTP muss man die Zugangsdaten im Programm hinterlegen, das halte ich nicht für günstig.
Wer nicht fragt, der nichts lernt.
Wer keine Fehler macht, kann sich nicht verbessern.
Das Mysterium, ein wandelndes Lexikon. :mrgreen:

Wer Fragen zu meinem Textstil hat oder sich wundert über mich,
der darf seelenruhig mich direkt ansprechen. Ich beiße noch nicht.
Antworten