Forum | | | | funkheld | Hallo, guten Tag. Ich habe dieses Programm für XPSE etwas verändert. Und es kommt immer noch eine Fehlermeldung. Ich finden den Typ von Fehler nicht:
Wo steckt der ? Zeile 88 ist im XProfEd leer. KompilierenMarkierenSeparieren {$cleq}
Def CopyMemory(3) !"KERNEL32","RtlMoveMemory"
Declare Ende%, SendeBtn&, EndeBtn&, Edit&
Declare Groesse&, Text$, ProgHndl&, AltProc&
Declare CopyData#, EigeneDaten#
Struct SCopyData = ~COPYDATASTRUCT
Dim CopyData#, SCopyData
Window 20,20-400,400
WindowTitle "Programm2"
EndeBtn& = Create(Button,%hWnd,Beenden,105,50,70,20)
SendeBtn& = Create(Button,%hWnd,Senden,15,50,70,20)
Edit& = Create(Edit, %hWnd, , 10, 15, 170, 24)
Proc Senden
Parameters Nachricht$
With CopyData#
.dwData& = 0
.cbData& = SizeOf(Nachricht$)
.lpData& = Addr(Nachricht$)
EndWith
Sendmessage(ProgHndl&,~WM_COPYDATA,%hWnd,Addr(CopyData#))
EndProc
Proc WndProc
parameters wnd&, msg&, wparam&, lparam&
If msg&=~WM_COPYDATA
CopyMemory(CopyData#,lparam&,12)
Groesse& = CopyData#.cbData&
Dim EigeneDaten#, Groesse&
CopyMemory(EigeneDaten#,CopyData#.lpData&,Groesse&)
Text$ = String$(EigeneDaten#,0)
Dispose EigeneDaten#
EndIf
return call(AltProc&,wnd&,msg&,wparam&,lparam&)
Endproc
AltProc&=~SetWindowLong(%hwnd,~GWL_WNDPROC,ProcAddr(WndProc,4))
While 1
ProgHndl&=FindWindow("Programm2")
Case ProgHndl&: Break
Sleep 100
EndWhile
Usermessages ~WM_COPYDATA
WhileNot Ende%
WaitInput
If %Key = 2
Ende% = 1
ElseIf GetFocus(EndeBtn&)
Ende% = 1
ElseIf GetFocus(SendeBtn&)
Senden GetText$(Edit&)
ElseIf %umessage=~WM_COPYDATA
SetText Edit&, Text$
Endif
EndWhile
Dispose CopyData#
End
Danke.
Gruss peter |
| | | | |
| | | | | | | |
| | | Hauptfenster Subclassing z.B. so: KompilierenMarkierenSeparierendeclare owp&
cls
owp&=setWindowLong(hWnd,gwl_wndProc,procaddr(hWnd.wndProc,4))
waitinput
end
nProc hWnd.wndProc
Parameters wnd&,msg&,wp&,lp&
global owp&
return callWindowProc(owp&,wnd&,msg&,wp&,lp&)
endproc
oder ohne globale Variable: KompilierenMarkierenSeparierencls
setWindowLong(hWnd,gwl_userData,setWindowLong(hWnd,gwl_wndProc,procaddr(hWnd.wndProc,4)))
while 1
waitinput
wend
end
nProc hWnd.wndProc
Parameters wnd&,msg&,wp&,lp&
if msg&=wm_lButtonDown
exitProcess(22)
endif
return callWindowProc(getWindowLong(wnd&,gwl_userData),wnd&,msg&,wp&,lp&)
endproc
Garantiert absturzsicher.
Siehe auch Beispiele am Ende dieses Dokumentes: [...]
Hinweis:
XProfan-Fehlermeldungen-Fehlerzeile-Angabe beim Einsatz mit XPSE müsste der Zeile in der dateiname.ENH-Datei entsprechen. |
| | | | |
| | funkheld | Jup, danke. Habe ich jetzt geändert. Es startet, aber friert dann ein. Irgendwie ist das Programm nicht auf den neuesten Stand.
Woran liegt das denn nun? Oder hast du irgendwo ein Programm , wo man Daten von einem Fenster zum anderen Fenster senden kann ?
Danke.
Gruss peter |
| | | | |
| | | Dafür ist die Funktion sendMessage ja da, um Daten an Controls/ Fenster zu senden.
Damit kann man ganz praktisch 3 ganzzahlige Werte übermitteln: KompilierenMarkierenSeparieren |
| | | | |
| | | Nachtrag:
Ich sehe das Du wm_copyData verwenden möchtest -
macht eig. nur Sinn wenn man mehr als 3 Werte übermitteln möchte wie z.B.
einen Stringinhalt. wm_copyData als UserMessage kann aber nicht zuverlässig
funktionieren da zum Zeitpunkt des Auslesens von WP und LP die Daten nicht
mehr zur Verfügung stehen (müssen) da die Daten normal nur so lange bestehen
bis die Nachricht die wProc erreicht hat. Du kannst jedoch wm_copyData-
übermittelte Daten in der wProc erhalten und von dort aus weiterverwenden. |
| | | | |
| | funkheld | Ich habe hier etwas gefunden. Funktioniert nach meinen Vorstellungen..
Hiermit sende ich jetzt : KompilierenMarkierenSeparieren {$cleq}
Declare Ende&, senden&, Dlg&,wert&
declare IsActive&, InMemory&, SizeOfMem&, hmap&, hMapView&
Dlg& = Create("Dialog", %hwnd, "Senden", 220, 190, 410, 280)
senden& = Create("Button", Dlg&, "Senden", 110, 220, 80, 30)
Ende& = Create("Button", Dlg&, "Ende", 210, 220, 80, 30)
IsActive& = 0
InMemory& = 4000
'1024 Bytes Speicher
SizeOfMem& = 1024
'Speicherbereich anlegen
hmap& = ~CreateFileMapping(-1,0,~PAGE_READWRITE,0,SizeOfMem&,"MeinSpeicher")
'Zeiger auf Speicherbereich ermitteln
hMapView& = ~MapViewOfFile(hMap&,$000F001F, 0, 0, 0)
'die ersten 4 Bytes erhalten das Fensterhandle
Long hMapView&,0 = %hwnd
'die nächsten 4 Bytes bleiben frei für das Fensterhandle von Programm 2
wert&=0
WhileNot @Clicked(Ende&)
WaitInput
If @Clicked(senden&)
If Long(hMapView&,4) <> 0
IsActive& = 1
Endif
dat_send
EndIf
EndWhile
End
proc dat_send
wert&=wert&+1
long hMapView&,8 = wert&
If IsActive&
sendMessage(Long(hMapView&,4),InMemory&,0,0)
endif
endproc
Hiermit wird empfangen: KompilierenMarkierenSeparieren {$cleq}
Declare IsActive&, InMemory& , Ende&, SizeOfMem&, hmap&, hMapView&
IsActive& = 0
InMemory& = 4000
Ende& = 0
'1024 Bytes Speicher
SizeOfMem& = 1024
'Speicherbereich anlegen
hmap& = ~CreateFileMapping(-1,0,~PAGE_READWRITE,0,SizeOfMem&,"MeinSpeicher")
'Zeiger auf Speicherbereich ermitteln
hMapView& = ~MapViewOfFile(hMap&,$000F001F, 0, 0, 0)
Cls
'die zweiten 4 Bytes erhalten das Fensterhandle
Long hMapView&,4 = %hwnd
UserMessages InMemory&
whilenot Ende&
Waitinput
If %UMessage = InMemory&
Print long(hMapview&,8)
Endif
EndWhile
~UnmapViewOfFile(hMapView&)
~CloseHandle(hMapView&)
End
Wird diese : %UMessage jedesmal nach dem durchlauf auf "0" gesetzt und neu beschrieben bei einer neuen Übertragung oder bleibt bei der ersten Verbindung %UMessage auf den Wert InMemory& ?
Danke.
Gruss peter |
| | | | |
| | | | | | | |
| | funkheld | Jup, danke. Jetzt kann ich die Sendmessage erkennen bzw einordnen.
Gruss peter |
| | | | |
|
AntwortenThemenoptionen | 3.495 Betrachtungen |
ThemeninformationenDieses Thema hat 2 Teilnehmer: |