Seite 3 von 4
Verfasst: 03.11.2006 20:37
von ts-soft
Metaller hat geschrieben:
Global bedeutet, das die Variable auch in Proceduren bekannt ist. vorausgesetzt die Proceduren werden hinter der Variablendeklaration definiert.
Define wird meist für lokale Variablen, die nur im Main-Bereich, also ausserhalb von Proceduren verwendet werden. Lokale Variablen innerhalb von Prozeduren deklariert man am besten Protected. Diese sind nur in der Procedure gültig, wo sie deklariert wurden.
Die Variante ohne Deklaration ist auch lokal, aber das sollte man nicht machen. Dadurch kann es zu Fehlern kommen!
Pointer sind immer Long, weil eine Adresse im Speicher in einem 32-Bit System immer 32-Bit hat.
Verfasst: 03.11.2006 20:56
von Metaller
Danke Euch beiden

Sooo laaaaaaannnngsaaaaam kommt Licht ins Dunkel

Und keine Angst, ich werde Euch noch weiter mit Fragen quälen

Verfasst: 04.11.2006 15:55
von Metaller
Huhu,
wäre einer von Euch so nett und könnte über den Code sehen? Ich weiß nicht, warum ich immer "dwError = 0" erhalte ("UIPCMAIN" wird gefunden). Was mache ich falsch?
Code: Alles auswählen
#MSGNAME1 = "FSASMLIB:IPC"
#SMTO_BLOCK = 1
;=======================================================
m_hWnd.l = 0
m_msg.l = 0
m_atom.l = 0
m_hMap.l = 0
dwError.l = 0
szName.s{24}
;=======================================================
m_hWnd = FindWindowEx_(#Null, #Null, "UIPCMAIN", #Null)
Debug "m_hWnd = " + Str(m_hWnd)
;=======================================================
m_msg = RegisterWindowMessage_(#MSGNAME1)
Debug "m_msg = " + Str(m_msg)
;=======================================================
szName = #MSGNAME1 + ":" + Hex(GetCurrentProcessId_()) + ":" + "1" + Chr(0)
Debug "szName = " + szName
;=======================================================
m_atom = GlobalAddAtom_(@szName)
Debug "m_atom = " + Str(m_atom)
;=======================================================
SendMessageTimeout_(m_hWnd, m_msg, m_atom, 0, #SMTO_BLOCK, 2000, dwError)
Debug "dwError = " + Str(dwError)
;=======================================================
GlobalDeleteAtom_(m_atom)
CloseHandle_(m_hMap)
Verfasst: 04.11.2006 16:20
von edel
in dem Code ist nichts falsch. Dein anderes Programm
scheint aber auf die Message "m_msg" nicht zu regieren
oder gibt halt 0 zurueck.
Verfasst: 04.11.2006 16:32
von Metaller
Danke für die super schnelle Antwort
Tja das habe ich befürchtet, das mein Code stimmt

Hier mal ein Auszug aus dem Debug:
Code: Alles auswählen
m_hWnd = 459582
m_msg = 49665
szName = FSASMLIB:IPC:B1C:1
m_atom = 1228941
dwError = 0
Verfasst: 04.11.2006 16:47
von edel
Dein anderes programm muss in etwa so darauf reagieren :
Code: Alles auswählen
#MSGNAME1 = "FSASMLIB:IPC"
Global m_msg = RegisterWindowMessage_(#MSGNAME1)
Procedure callback(hwnd,msg,wParam,lParam)
If msg = m_msg
ProcedureReturn 1234567890 ; <-- result
EndIf
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
m_hWnd = 2557830
m_msg = 49712
szName = FSASMLIB:IPC:A80:1
m_atom = 1228840
dwError = 1234567890
Verfasst: 04.11.2006 17:59
von Metaller
"SetWindowCallback(m_msg)" gibt mir die gleiche Nummer wie wie bei der Registration raus. Die Callback-Funktionen sind garnicht oder nur sehr schlecht dokumentiert. Selbst die API Funktion gibt mir den Rest. Dort ist alles genauestens Beschrieben, aber ich verstehe nur Bahnhof.
Dat war es nun mit PB und mir. Nach einer Woche (täglich über 10h vor der Kiste) intensivster Arbeit und ich habe nur so'ne popelige COM-Anwendung hinbekommen und das hat nur ein Tag gedauert. Den Rest habe ich für das um- und neuschreiben der Anwendung verplempert. Egal ob ich die VB-, C/C++-, ASM- oder Delphi-Vorlage genommen habe, es kam alles auf's gleiche raus.
Es tut mir ehrlich sehr Leid, dass ich Eure Zeit, die Ihr in die Beantwortung meiner Fragen investiert habt, nicht zurückgeben kann. Wer meine PB Version haben möchte, der kann sich per PM bei mir melden und ich werde Ihm mein Zugang zum DL-Bereich geben. Den Login kann er dann ändern. Der Preis ist VHB.
Ich wünsche Euch noch viel Erfolg für Eure PB-Projekte und hoffe, dass Ihr niemals an die Grenzen des Programmes kommt, so wie ich.
Schönen Gruß... Metaller
Verfasst: 05.11.2006 01:59
von edel
Vielleicht ist es so etwas verstaendlicher.
Code: Alles auswählen
#MSGNAME1 = "FSASMLIB:IPC"
Global m_msg = RegisterWindowMessage_(#MSGNAME1)
Procedure WndProc(hwnd,uMsg,wParam,lParam)
; message abfangen
If uMsg = #WM_MOVE
Debug "fenster wird bewegt"
EndIf
; deine message
If uMsg = m_msg
Debug "FSASMLIB:IPC"
ProcedureReturn 1234567890 ; <-- result
EndIf
; in etwa das gleiche wie CallWindowProc_()
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
#fenster = 0
hwnd = OpenWindow(#fenster,#PB_Ignore,#PB_Ignore,300,300,"Test")
SetWindowCallback(@WndProc(),#fenster) ; mit @ bekommt man die adresse
; der Procedure , variable usw...
Repeat
event = WaitWindowEvent()
Until event = #WM_CLOSE
Verfasst: 05.11.2006 02:23
von Metaller
Du bist echt super edel

Vielen Dank. Aber ergibt nur "fenster wird bewegt" aus und läßt m_msg links liegen. So nebenbei, wie ist die Definition von Window in Bezug auf das Callback? Muß es ein richtiges Fenster sein? Denn das ist es nicht. Es liegt nur im Speicher rum und sendet bzw. schreibt auf ein Request Daten in das andere Programm. Wird sowas auch als Window definiert?
Verfasst: 05.11.2006 02:32
von edel
Das Programm was die msg verschickt braucht kein Callback oder Fenster.
Das Programm was die msg aber bekommt muss ein Fenster sein , ein
Callback ist da aber optional,ohne Callback allerdings kann man dann nicht
selber auf die msg reagieren.
Im obigen Code ist doch ein Fehler , SendMessageTimeout erwartet am Ende
einen Pointer , also so :
Code: Alles auswählen
SendMessageTimeout_(m_hWnd, m_msg, m_atom, 0, #SMTO_BLOCK, 2000,@dwError)