UserLibrary

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

LIB

Beitrag von H.Brill »

Hallo,
Ich hätte da auch eine Frage.

Ich habe eine LIB, geschrieben in ASM.
Den Quellcode habe ich nicht, da die
LIB nicht von mir ist. Jetzt gibt es da ja
den LibImporter (von Freak ?). Da die
Funktionen in dieser LIB ja keinen PB_
enthalten, wollte ich diese mit besagtem
LibImporter konvertieren. Da kommen
beim Testen der neuen LIB halt die Fehler,
daß die Symbole nicht aufgelöst werden
können ( _Funktion). Der LibImporter ist
wahrscheinlich nur auf C - Funktionen
zugeschnitten.

Wie könnte man den Quellcode, der ja beim
LibImporter beiliegt so verändern, daß man
auch ASM - Libs konvertieren könnte.

Wenn das ginge, könnte ich mir ja 2 Radiobuttons
einbauen, je nachdem, ob es eine C-LIB oder
ASM-LIB ist.

Eine Speicherung der eingetragenen Funktionen
habe ich mir schon selbst mit 2 Buttons gemacht.
Zuletzt geändert von H.Brill am 25.05.2005 19:05, insgesamt 1-mal geändert.
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag von Ynnus »

für was brauchst du konstanten in einer UserLibary?
[Edit]Also nicht das man es falsch versteht aber normal braucht man doch nur Konstanten in einer Procedure oder?[/Edit]
(...)
Uns für was?
Ich geb mal ein Beispiel:

(C & C++ & WinAPI Code)

Code: Alles auswählen

void ctrl_window::add_scrollbar(int typ, int min, int max, int pos)
{
    if (typ == SB_VERT)     //Vertical Scrollbar
    {
        SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) | WS_VSCROLL);     //Create Scrollbar
        scrollinfo_VERT.cbSize = sizeof(SCROLLINFO);        //Fill Structure with informations
        scrollinfo_VERT.fMask = SIF_ALL;
        scrollinfo_VERT.nMin = min;
        scrollinfo_VERT.nMax = max;
        scrollinfo_VERT.nPage = 1;     //Size of Thumbbox
        scrollinfo_VERT.nPos = pos;

        SetWindowPos(hwnd, HWND_TOP, NULL, NULL, NULL, NULL, SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE);
        SetScrollInfo(hwnd, SB_VERT, &scrollinfo_VERT, true);
    }
    else        //Horizontal Scrollbar
    {
        SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) | WS_HSCROLL);     //Create Scrollbar
        scrollinfo_HORZ.cbSize = sizeof(SCROLLINFO);        //Fill Structure with informations
        scrollinfo_HORZ.fMask = SIF_ALL;
        scrollinfo_HORZ.nMin = min;
        scrollinfo_HORZ.nMax = max;
        scrollinfo_HORZ.nPage = 1;     //Size of Thumbbox
        scrollinfo_HORZ.nPos = pos;

        SetWindowPos(hwnd, HWND_TOP, NULL, NULL, NULL, NULL, SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE);
        SetScrollInfo(hwnd, SB_HORZ, &scrollinfo_HORZ, true);
    }
}
Hierbei kann eine Scrollbar zu einem Fenster hinzugefügt werden. Da man aber Scrollbars Vertikal und Horizontal vergeben kann, bräuchte ich entweder 2 Funktionen oder eine Variable die den Typ der gewünschten Variable angibt. Und da kann man Konstanten nehmen. Hier greif ich zwar jetzt auf die, von Windows vordefinierte, SB_HORZ und SB_VERT zurück, aber man könnte auch eigene Konstanten verwenden.
Je nachdem was als "int typ" angegeben wird, wird eine horizontale oder vertikale Scrollbar erstellt. Und wenn man das in eine Userlib packt, wär es gut, die Konstante mitzuliefern. Ansonsten muss man ja mit den Werten hantieren, die ich aber so nicht kenne. Leichter zu merken ist der Name als der Wert. ;)

Allein die WinAPI nutzt fast überall ( und dann massig) Konstanten. Die sind also überall in Gebrauch. Da ist es schon nicht schlecht, die Konstanten direkt der Userlib mitgeben zu können.
Benutzeravatar
Green Snake
Beiträge: 1394
Registriert: 22.02.2005 19:08

Re: LIB

Beitrag von Green Snake »

Ich habe eine LIB, geschrieben in ASM.
Den Quellcode habe ich nicht, da die
LIB nicht von mir ist.
hä? wie geht denn das?
du hast ne lib geschrieben, die nicht von dir ist? :lol:

ich denke du hast was anderes gemeint, ich ziehe halt leute gerne ein wenig auf :lol:
-.-"
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: LIB

Beitrag von Danilo »

Green Snake hat geschrieben:hä? wie geht denn das?
du hast ne lib geschrieben, die nicht von dir ist? :lol:
Das hat er nicht gesagt. Lerne doch bitte erst einmal
Kommata richtig zu interpretieren.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
Green Snake
Beiträge: 1394
Registriert: 22.02.2005 19:08

Beitrag von Green Snake »

so ne sch****e
ich habe das komma überlesen

tut mir sehr leid H.Brill
*ich sollte mir wohl mal ne brille zulegen :lol: *

sorry
-.-"
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: LIB

Beitrag von Danilo »

H.Brill hat geschrieben:Ich habe eine LIB, geschrieben in ASM.
Den Quellcode habe ich nicht, da die
LIB nicht von mir ist. Jetzt gibt es da ja
den LibImporter (von Freak ?). Da die
Funktionen in dieser LIB ja keinen PB_
enthalten, wollte ich diese mit besagtem
LibImporter konvertieren. Da kommen
beim Testen der neuen LIB halt die Fehler,
daß die Symbole nicht aufgelöst werden
können ( _Funktion). Der LibImporter ist
wahrscheinlich nur auf C - Funktionen
zugeschnitten.

Wie könnte man den Quellcode, der ja beim
LibImporter beiliegt so verändern, daß man
auch ASM - Libs konvertieren könnte.
Sorry, habe Deine Frage jetzt erst gesehen (durch den
Kommentar von Green Snake).

Schau mal im LibImporter die Zeile 209 an:

Code: Alles auswählen

    WriteStringN("  JMP _"+Name$+Size$)
Das importieriert __stdcall-Funktionen in der Form:
'_Name@ArgumentenZahlInBytes'

Wenn Du diese Zeile änderst in:

Code: Alles auswählen

    WriteStringN("  JMP "+Name$)
springt es die Funktion ohne '_' und '@Zahl' an, also ein
reines ASM-Label ohne Name Decoration.

In Zeile 194 mußt Du das auch ändern, also "_" und "+Size$"
entfernen:

Code: Alles auswählen

    WriteStringN("extrn "+Name$)
Funktioniert aber nur wenn die ASM-Funktionen für die
Calling Convention stdcall geschrieben wurden.
Sollte eigentlich meistens der Fall sein. Wenn nicht ist
noch etwas mehr Arbeit nötig - aber dann muß man
genau die verwendete Richtlinie kennen.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

[OFFTOPIC]
Sunny hat geschrieben:Ich geb mal ein Beispiel:

(C & C++ & WinAPI Code)

Code: Alles auswählen

void ctrl_window::add_scrollbar(int typ, int min, int max, int pos)
{
    if (typ == SB_VERT)     //Vertical Scrollbar
    {
        SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) | WS_VSCROLL);     //Create Scrollbar
        scrollinfo_VERT.cbSize = sizeof(SCROLLINFO);        //Fill Structure with informations
        scrollinfo_VERT.fMask = SIF_ALL;
        scrollinfo_VERT.nMin = min;
        scrollinfo_VERT.nMax = max;
        scrollinfo_VERT.nPage = 1;     //Size of Thumbbox
        scrollinfo_VERT.nPos = pos;

        SetWindowPos(hwnd, HWND_TOP, NULL, NULL, NULL, NULL, SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE);
        SetScrollInfo(hwnd, SB_VERT, &scrollinfo_VERT, true);
    }
    else        //Horizontal Scrollbar
    {
        SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) | WS_HSCROLL);     //Create Scrollbar
        scrollinfo_HORZ.cbSize = sizeof(SCROLLINFO);        //Fill Structure with informations
        scrollinfo_HORZ.fMask = SIF_ALL;
        scrollinfo_HORZ.nMin = min;
        scrollinfo_HORZ.nMax = max;
        scrollinfo_HORZ.nPage = 1;     //Size of Thumbbox
        scrollinfo_HORZ.nPos = pos;

        SetWindowPos(hwnd, HWND_TOP, NULL, NULL, NULL, NULL, SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE);
        SetScrollInfo(hwnd, SB_HORZ, &scrollinfo_HORZ, true);
    }
}
Das geht auch kürzer, da 98% der 2 Codeteile gleich sind:

Code: Alles auswählen

void ctrl_window::add_scrollbar(int typ, int min, int max, int pos)
{
    SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) | ((typ == SB_VERT) ? WS_VSCROLL : WS_HSCROLL));     //Create Scrollbar
    scrollinfo.cbSize = sizeof(SCROLLINFO);        //Fill Structure with informations
    scrollinfo.fMask = SIF_ALL;
    scrollinfo.nMin = min;
    scrollinfo.nMax = max;
    scrollinfo.nPage = 1;     //Size of Thumbbox
    scrollinfo.nPos = pos;

    SetWindowPos(hwnd, HWND_TOP, NULL, NULL, NULL, NULL, SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE);
    SetScrollInfo(hwnd, typ, &scrollinfo, true);
}
Das wichtigste daran ist der Ausdruck:
((typ == SB_VERT) ? WS_VSCROLL : WS_HSCROLL)

Wenn (typ == SB_VERT) true ist, dann wird WS_VSCROLL
genommen, ansonsten WS_HSCROLL.

Aber das nur mal nebenbei... ;)
[/OFFTOPIC]
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

LIB

Beitrag von H.Brill »

Hallo,

Danke Danilo,

Das hatte ich genau gemeint. Werde es
dann mal umändern und testen.

PS: Ursprünglich ist das eine DLL (Shareware).
Ich hatte den Autor nach einer LIB gefragt, weil
ich dann die DLL nicht rumschleppen muß. Der
hatte mir dann die LIB geschickt. Die fällt sowie
an, wenn er die DLL mit dem MASM neu übersetzt.
(laut seiner Aussage).
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

LIB

Beitrag von H.Brill »

Die Funktionen werden schon mal richtig
gestrippt. Bekomme aber immer noch die
Fehler
POLINK error: Unresolved external Symbol '...'

Denke mal, daß es keine richtige statische LIB
ist, sondern sowas ähnliches was VC++ (glaube ich)
produziert oder was das LibTool ausgibt.

Habe auch mal mit einem Texteditor reingeschaut.
Der Anfang
!<arch>
ist ja richtig, aber ich habe auch Referenzen zu seiner
DLL drin gesehen. Da muß ich ihn am Montag erst
fragen, was der MASM da ausgibt, bzw. ob er den
Output anders einstellen kann.
Antworten