Sie sind nicht angemeldet.

1

Donnerstag, 25. Januar 2018, 13:13

Wo ist der Prototype?

Ich würde gern eine spezielle Msg aus GROBJ.GOH anwenden (bei mir Zeile 7407). Neben dem Messagenamen steht /*Needs Prototype*/. Ich denke, dass ich alles abgesucht habe, eine entsprechnede Prototype-Msg habe ich nicht gefunden. Und ohne funktioniert die Parameterübergabe (natürlich) nicht. Kann man wohl nichts machen oder?

Wilfried

2

Donnerstag, 25. Januar 2018, 15:28

Nu ma nich so pessimistisch ;-)

Folgende Messages werden gerufen wenn der Mauspointer ein View betritt oder verlässt.
@importMessage MetaWindowMessages, void MSG_META_RAW_UNIV_ENTER (); /* NEEDS PROTOTYPE! */

@importMessage MetaWindowMessages, void MSG_META_RAW_UNIV_LEAVE (); /* NEEDS PROTOTYPE! */

In irgend einem anderen Header, den ich jetzt nicht gefunden habe, steht auch in welchen Registern du was übergeben musst (in Assembler)

Um sie zu benutzen muss man C-Parameter haben . Das habe ich mit Grossibärs Hilfe so gemacht:

@class PaintViewClass, GenViewClass;
@alias (MSG_META_RAW_UNIV_ENTER) void MSG_PAINT_VIEW_ENTER
(optr inputObj = cx:dx, WindowHandle ptrWin = bp);
@alias (MSG_META_RAW_UNIV_LEAVE) void MSG_PAINT_VIEW_LEAVE
(optr inputObj = cx:dx, WindowHandle ptrWin = bp);
@endc;

Wenn die Message einen Returnparameter in carry übergibt muss du statt "void ...."
"Boolean ... = carry" schreiben.

Vielleicht hilfts ja ;-)

Gruß
Rainer


Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

3

Donnerstag, 25. Januar 2018, 17:22

Ich weiß nicht recht, ob ich das verstanden habe :( .
"MSG_PAINT_VIEW_ENTER" ist also deine eigene Creation? Und die Message, die eigentlich einen Prototype benötigt, wird unter einem Alias-Namen verwendet?
In der von mir angesprochenen Message werden die Übergabeparameter einschließlich der zu verwendenden Register genannt.

4

Donnerstag, 25. Januar 2018, 21:37

Im Prinzip ja. Frag micht nicht warum, aber so macht man es wohl ;-)
Welche Message ist es denn? Mach mal bitte einen Auszug aus deiner GrObj.goh.
Gruß
Rainer
Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

5

Freitag, 26. Januar 2018, 11:14

Hallo Rainer, hier die Message:
@message void MSG_GOAM_GET_FULL_LINE_ATTR_ELEMENT(); /* Needs Prototype */
/*
* Get line attribute element from element array
*
* Context: GrObjAttributeManager Utility
* Source: Unrestricted
* Destination: GrObjAttributeManager
* Interception: Unlikely
*
* PASS
* cx - line token
* ss:bp - GrObjFullLineAttrElement - empty
*
* RETURN
* carry set if passed token valid
* ss:bp - GrObjFullLineAttrElement - filled
* ax - element size
*
* carry clear if no information retured
*
* DESTROYED:
* ax

Ich habe es nach deiner Anleitung jetzt so versucht:

@class GCGrObjAttributeManagerClass, GrObjAttributeManagerClass;

@alias (MSG_GOAM_GET_FULL_LINE_ATTR_ELEMENT) Boolean MSG_LINIENATTRIBUTE_HOLEN
(word index = cx, GrObjFullLineAttrElement *linienelement = ss:bp)=carry;

@endc

Den Inhalt von index habe ich.
pmake:
error: ss:bp cannot be used with any other register
warning: MSG_GOAM_GET_FULL_LINE_ATTR_ELEMENT is not a message for the class being defined now

Ich kann mit diesen Meldungen nicht viel anfangen.

Wilfried

6

Freitag, 26. Januar 2018, 16:52

Hm, das ist doof. Ich hätte es auch genau so versucht. Die Fehlermeldungen sagen mir jetzt auch nichts.
Mail doch mal Marcus oder Falk an, sie sollen mal auf den Thread schauen, vielleicht fällt ihnen etwas dazu ein.

Gruß
Rainer
Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

7

Sonntag, 28. Januar 2018, 18:49

Ist das wieder so'n Ding, wo man den Code als "Pascal" oder so dekorieren muss?
d[ 0_O ]b

8

Sonntag, 28. Januar 2018, 22:16

Die Übermittlung von Parametern auf dem Stack (ss:bp) und die zusätzliche übergabe vom CX-Register ist in der GOC/C-Message-API nicht vorgesehen, die entsprechenden Messages können mit GOC nicht angesprochen werden. Ggf. kommt man mit inline-ASM weiter.

9

Montag, 29. Januar 2018, 12:50

Hallo Falk,

per Inline-ASM hab ich's versucht, es wird aber nicht compiliert. Ich hab eigentlich auch keine Ahnung, wie Segment und Offset des Array-Elements an ss:bp übergeben werden. Muss bp erst gesichert werden? Das Aufrufen der Message wird jedenfalls nicht akzeptiert (Invalid combination of opcode and operants).

GrObjBaseLineAttrElement *linienattribute;
word index,linienattr_high,linienattr_low;

index=@call objekt::MSG_GO_GET_GROBJ_LINE_TOKEN(); //funktioniert!
linienattr_high=PtrToSegment(linienattribute);
linienattr_low=PtrToOffset(linienattribute);

asm {
mov cx, index
mov ss, linienattr_high
mov bp, linienattr_low

call MSG_GOAM_GET_FULL_LINE_ATTR_ELEMENT
}


Wilfried

10

Mittwoch, 31. Januar 2018, 12:13

Ich habe noch einen anderen Weg versucht:
Der GrObjAttributeManager hat die Instanzvariable GOAMI_lineAttrArrayHandle. Vielleicht hätte man über dieses Handle an das Attribute-Array kommen können. Leider hat dieses Handle immer den Wert 0, egal wieviele Linien mit unterschiedlichen Attributen existieren.
Schade :(

Wilfried

11

Mittwoch, 31. Januar 2018, 16:34

Hallo,
folgendes kam mir dabei in den Kopf:
index=@call objekt::MSG_GO_GET_GROBJ_LINE_TOKEN(); //funktioniert!
ich denken, syntaktisch geht es, der Compiler meckert nicht. Funktionell sollte es nicht gehen, weil die Übergabewerte nicht da sind.

call MSG_GOAM_GET_FULL_LINE_ATTR_ELEMENT
Macht man das nicht so?

Quellcode

1
2
3
mov das_richtige_register, MSG_GOAM_GET_FULL_LINE_ATTR_ELEMENT
mov andere_register, paramters
call CObjMessage


Rainer
Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

12

Mittwoch, 31. Januar 2018, 17:00

Hallo Rainer,

index=@call objekt::MSG_GO_GET_GROBJ_LINE_TOKEN() funktioniert tatsächlich. Ich erhalte korrekte Indices für das Attribute-Array (objekt ist der optr zum selektierten Grafikobjekt, vom GrBody geholt).

call MSG_GOAM_GET_FULL_LINE_ATTR_ELEMENT funktioniert dagegen nicht mal syntaktisch.

Deinen Quellcode verstehe ich nicht. Wo wird hier der Pointer auf das Array übergeben?

Wilfried

13

Donnerstag, 1. Februar 2018, 10:02

Sorry, dein Quellcode sollte ja nur das Senden einer Message verdeutlichen.
Wenn es also so geht, welches sind dann die richtigen Register?

Wilfried

14

Donnerstag, 1. Februar 2018, 21:21

Hallo Wilfried,
call MSG_GOAM_GET_FULL_LINE_ATTR_ELEMENT funktioniert dagegen nicht mal syntaktisch.
Natürlich nicht, MSG_GOAM_GET_FULL_LINE_ATTR_ELEMENT ist eine Zahl, also eigentlich eine C-Konstante ;-)


Wenn ich dass richtig verstanden haben, geht das mit dem Senden einer Message in Assember so:
- Lade die Message-Nummer in ein Register (AX ?)
- lade die Parameter in anderer Register oder pushe sie auf den Stack
- Rufe eine Asm-Routine, die den eigentlichen Message-Aufruf erledigt.


Die nötigen Parameter hast du oben schon selbst beschrieben:
* PASS
* cx - line token
* ss:bp - GrObjFullLineAttrElement - empty
Für folgendes musst du noch mal die Quellcodes durchforsten, da bin ich jetzt nicht sicher
1. Die Message muss du wahrscheinlich nach AX laden
2. Vielleicht heißt die Routine, die du callen musst nicht CObjMessage sondern nur ObjMessage oder irgendwie ähnlich.

Um den Inline Assembler zu benutzen musst du vor jede Zeile asm schrieben oder du versuchst
asm {
.. code hier
}

Wenn ich komplett falsch liege, lass es mich wissen ;-)

Rainer
Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

Thema bewerten