Codeumwandlung oder umstieg nach VB?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Metaller hat geschrieben:

Code: Alles auswählen

Global myVar.w
Define myVar.w
myVar.w
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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Metaller
Beiträge: 37
Registriert: 01.11.2006 13:20

Beitrag von Metaller »

Danke Euch beiden :) Sooo laaaaaaannnngsaaaaam kommt Licht ins Dunkel :mrgreen: Und keine Angst, ich werde Euch noch weiter mit Fragen quälen <)
Metaller
Beiträge: 37
Registriert: 01.11.2006 13:20

Beitrag 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)
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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.
Metaller
Beiträge: 37
Registriert: 01.11.2006 13:20

Beitrag 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
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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
Metaller
Beiträge: 37
Registriert: 01.11.2006 13:20

Beitrag 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
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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
Metaller
Beiträge: 37
Registriert: 01.11.2006 13:20

Beitrag von Metaller »

Du bist echt super edel :allright: 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?
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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)
Antworten