| |
|
|
Matthias Arlt | Meine ersten Versuche mit Assembler gestalten sich dank Franks Einführungskurs besser als gedacht...! Nun habe ich aber folgendes Problem bzw. nen Denkfehler drin:
Eine ASM-Routine ermittelt einen String und schreibt diesen in einen Bereich. Das Auslesen klappt mit invoke MessageBox , 0, addr buffer, usw. bestens. Wenn ich nun statt Ausgabe in einer Messagebox den String im Profan-Programm weiterverarbeiten will, wie übergebe ich diesen korrekt? (addr buffer geht ja nur nach einem invoke...)
Matthias |
|
|
| WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia | 12.12.2006 ▲ |
|
|
|
|
Jörg Sellmeyer | Wenn Du den String in einem Bereich hast, müßtest Du ihn mit Text$=String$(B#,Addr&) auslesen können. Wobei Addr& = 0 ist, wenn der String am Anfang des Bereichs steht. |
|
|
| Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 12.12.2006 ▲ |
|
|
|
|
Michael Dell | In der Regel ist Buffer ja ein DWord (Long) das auf einen Speicherbereich zeigt. Dann sollte als letzter Befehl mov eax, buffer reichen.
Ich persöhnlich würde in XProfan einen Bereich oder einen mit Chr$(0) gefüllten String$ als zusätzlichen Parameter übergeben und diesen dann z.B.: mit invoke MemCopy... die Daten übergeben, das hat dann den Vorteil das Du allen Speicher in der Funktion zum Ende hin freigeben kannst. Dabei kannst Du dann mit eax noch einen Fehlercode zurückgeben, so wird das auch in der WinAPI häufig gemacht. |
|
|
| Salu Michael...
Hab zwar krumme Fieß awer dofir e' ecklich Gsicht! | 12.12.2006 ▲ |
|
|
|
|
Matthias Arlt | @Jörg Genauso dachte ich ja auch, aber...
declare txt# dim txt#,256
Folgender Code in der erzeugten DLL
AsmStart LVGetItemText
Parameters hdl&,spalte&,txt#
LOCAL lvi:LV_ITEM
invoke SendMessage, para1, LVM_GETNEXTITEM, -1, LVNI_FOCUSED
mov lvi.iItem, eax
mov ebx, para2
mov lvi.iSubItem, ebx
mov lvi.imask, LVIF_TEXT
lea eax, para3
mov lvi.pszText, eax
mov lvi.cchTextMax, 256
invoke SendMessage, para1, LVM_GETITEM, 0, addr lvi
invoke MessageBox, 0, addr para3, 0, MB_OK
mov eax, para3
AsmEnd
weiter in Profan
...Aufruf der DLL-Funktion mit ...hdl&,spalte&,txt#)
print string$(txt#,0) bleibt erfolglos, während Messagebox korrekt fünktioniert
Wo also liegt mein Fehler ???
@Michael Danke, ich werds mal mit MemCopy versuchen. Mal sehen... |
|
|
| WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia | 12.12.2006 ▲ |
|
|
|
|
Michael Dell | Ach so, hier könnte ein einfaches Return txt# nach mov eax, para3 reichen. Wenn das nicht funzt declariere txt2# mit den gleichen werten wie txt# und schreibe Return txt2# und nach der Funktion print string$(txt2#,0). |
|
|
| Salu Michael...
Hab zwar krumme Fieß awer dofir e' ecklich Gsicht! | 12.12.2006 ▲ |
|
|
|
|
Jörg Sellmeyer | Müßte das hier nicht hdl&,spalte&,Addr(txt#)) heißen? |
|
|
| Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 12.12.2006 ▲ |
|
|
|
|
Matthias Arlt | So, alle Varianten durchprobiert (txt#...txt2#...addr(txt#)...), aber Ergebnis leider wie gehabt. Während unter Profan7 immerhin noch unbrauchbare Zeichen mit string$(txt#,0) ausgelesen werden, passiert unter XProfan nach der Messagebox rein garnichts. Versuche mit invoke MemCopy... schlagen wegen Zugriffsverletzung ebenfalls fehl. Das Rätseln geht also weiter... |
|
|
| WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia | 12.12.2006 ▲ |
|
|
|
|
Frank Abbing | lea eax, para3 mov lvi.pszText, eax mov lvi.cchTextMax, 256
muss heissen:
m2m lvi.pszText, para3 mov lvi.cchTextMax, 256
oder
mov eax, para3 mov lvi.pszText, eax mov lvi.cchTextMax, 256
para3 ist ja der Zeiger auf einen String und die Listviewmessage erwartet auch einen Zeiger auf einen String.
mov eax, para3 AsmEnd
Ist eigentlich Quatsch, weil der Returnwert = txt# ist. Übrigens kannst du besser den Debugger anstelle einer Messagebox nutzen, um Zahlenwerte oder Strings anzuzeigen. Probier mal:
PrintDec eax
oder
PrintStringByAddr para3
P.S.: Prima, dass dir mein Kurs gefallen hat. |
|
|
| |
|
|
|
Matthias Arlt | @Frank Besten Dank, funktioniert perfekt ! Hast mir sehr geholfen !!!
Ansonsten klappt das DLL-Erstellen schon ganz gut. Ich habe Deinen XPIA quasi als Standalone-Tool in PRFellow eingebunden und bastle mir damit auf recht komfortable Weise aus dem Editor heraus meine DLLs (für derzeit noch Profan7) zusammen. Ggf. lade ich das mal als PRFellow-Erweiterung hier hoch...
Matthias |
|
|
| WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia | 12.12.2006 ▲ |
|
|
|
|
Frank Abbing | Prima, das kann bestimmt der eine oder andere gebrauchen. PrFellow erfreut sich ja immer noch grosser Beliebtheit. |
|
|
| |
|
|
|
Matthias Arlt | Ich habe inzwischen noch ein weiteres Problem mit einem Stringvergleich. Folgender Code funktioniert zwar als Solcher, liefert aber immer ungleich zurück. Auch wenn Pufferinhalte definitiv gleich sind:
... cld mov ecx,sizeof Buffer2 lea esi,Buffer1 lea edi,Buffer2 repe cmpsb
jnz ungleich jz gleich ...
Habe schon unterschiedlichste Varianten durchprobiert, aber leider erfolglos...!?
Matthias |
|
|
| WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia | 17.12.2006 ▲ |
|
|
|
|
Frank Abbing | repe cmpsb ist veraltert. Nimm anstelle dessen lieber die APIs lstrcmp(), bzw. lstrcmpi(). Sicherer und viel schneller. |
|
|
| |
|
|