PureBasic Assembler Error

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

PureBasic Assembler Error

Beitrag von Mok »

Mahlzeit!

Ich habe grade folgendes Codeschnipsel aus dem Forum kopiert (zum erstellen von BallonTips):

Code: Alles auswählen

ProcedureDLL BalloonTip(WindowID, Gadget, Text$ , Title$, Icon)

  Static init
  Static tooltip
  Protected  style = #WS_POPUP | #TTS_NOPREFIX | #TTS_BALLOON
  
  If init = 0
    init = 1
    ToolTip=CreateWindowEx_(0,"ToolTips_Class32","",style,0,0,0,0,WindowID(WindowID),0,0,0)            
  EndIf 
  
  ToolTip=CreateWindowEx_(0,"ToolTips_Class32","",#WS_POPUP | #TTS_NOPREFIX | #TTS_BALLOON,0,0,0,0,WindowID(WindowID),0,GetModuleHandle_(0),0)
  SendMessage_(ToolTip,#TTM_SETTIPTEXTCOLOR,GetSysColor_(#COLOR_INFOTEXT),1)
  SendMessage_(ToolTip,#TTM_SETTIPBKCOLOR,GetSysColor_(#COLOR_INFOBK),0)
  SendMessage_(ToolTip,#TTM_SETMAXTIPWIDTH,0,300)
  Balloon.TOOLINFO\cbSize=SizeOf(TOOLINFO)
  Balloon\uFlags=#TTF_IDISHWND | #TTF_SUBCLASS
  Balloon\hWnd=GadgetID(Gadget)
  Balloon\uId=GadgetID(Gadget)
  Balloon\lpszText=@Text$
  SendMessage_(ToolTip, #TTM_ADDTOOL, 0, Balloon)
  If Title$ > ""
    SendMessage_(ToolTip, #TTM_SETTITLE, Icon, @Title$)
  EndIf
 
EndProcedure
Wenn ich den Code mit F5 ausführe oder die Procedure einfach in das Hauptprojekt kopiere und dann aufrufe ist noch alles okay. Wenn ich den Code aber in eine eigene Datei schmeiße, Procedure mit ProcedureDLL ersetze und eine DLL daraus machen will wird mir während dem Linken (also während dem Executable erstellen) folgender Fehler angezeigt:
Bild

Ich benutze im gesamten Projekt keine Assembler-Schlüsselwörter und hab auch die InlineASM-Unterstützung deaktiviert.

MfG, Mok
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: PureBasic Assembler Error

Beitrag von Kiffi »

funktioniert hier einwandfrei. Keine Fehlermeldung
oder sonstiges.

Grüße ... Kiffi

// Edit:
Wenn ich den Code aber in eine eigene Datei schmeiße, Procedure mit ProcedureDLL ersetze und eine DLL daraus machen will wird mir während dem Linken (also während dem Executable erstellen) folgender Fehler angezeigt:
kann ich aufgrund fehlenden Sources nicht nachvollziehen.
Zuletzt geändert von Kiffi am 15.02.2010 14:32, insgesamt 1-mal geändert.
Hygge
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: PureBasic Assembler Error

Beitrag von hjbremer »

DLLs und statische Libs mögen anscheinend keine Static Variablen

Code: Alles auswählen

Global tooltip
Global init

ProcedureDLL BalloonTip(WindowID, Gadget, Text$ , Title$, Icon)

  ;Static init
  ;Static tooltip
  Protected  style = #WS_POPUP | #TTS_NOPREFIX | #TTS_BALLOON

  ;.....

ohne das nun näher zu testen ist mir nicht klar wozu tooltip und init dienen und ganz besonders die 2 ToolTip=CreateWindowEx_() Anweisungen.
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

Re: PureBasic Assembler Error

Beitrag von Mok »

hjbremer hat geschrieben:DLLs und statische Libs mögen anscheinend keine Static Variablen
Stimmt. Mit Protected funzt es. Nicht gerade sehr benutzerfreundlich, so eine unaussagekräftige Assembler-Fehlermeldung, erinnert mich irgendwie an das, was passiert, wenn man in Java eine Exception nicht catcht.
b2t... warum ist per F5 dann alles "fresh" und wenn ich eine EXE (oder in meinem Fall eine DLL) mache, dann nicht mehr?

@Kiffi: Ich hab gemeint, wenn ich das obige Coedschnippsel in eine DLL reinhaue.
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: PureBasic Assembler Error

Beitrag von hjbremer »

Die Fehlermeldung sagt es doch

[s_BalloonTip.v_init]

v_ steht für Variable und init heißt dieselbe im Modul BallonTip

irgendetwas stimmt also nicht mit der Variable init

aber was ? :mrgreen: :mrgreen: :mrgreen:
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: PureBasic Assembler Error

Beitrag von edel »

PB erstellt selber sein Tooltipfenster. ist also nicht noetig noch eines zu erstellen, oder wie hier gleich 2 mal.
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

Re: PureBasic Assembler Error

Beitrag von Mok »

>> PB erstellt selber sein Tooltipfenster.
Jo, aber die Stanrd-Tool Tips schauen viel fader aus als die Balloon Tips

>>oder wie hier gleich 2 mal.
War ne veraltete Version, der Sourcecode sieht korrekterweise so aus:

Code: Alles auswählen

ProcedureDLL BalloonTip(WindowID, Gadget, Text$ , Title$, Icon)

  Protected init
  Protected tooltip
  Protected  style = #WS_POPUP | #TTS_NOPREFIX | #TTS_BALLOON
  
  If init = 0
    init = 1
    ToolTip=CreateWindowEx_(0,"ToolTips_Class32","",#WS_POPUP | #TTS_NOPREFIX | #TTS_BALLOON,0,0,0,0,WindowID(WindowID),0,GetModuleHandle_(0),0)
    SendMessage_(ToolTip,#TTM_SETTIPTEXTCOLOR,GetSysColor_(#COLOR_INFOTEXT),1)
    SendMessage_(ToolTip,#TTM_SETTIPBKCOLOR,GetSysColor_(#COLOR_INFOBK),0)
    SendMessage_(ToolTip,#TTM_SETMAXTIPWIDTH,0,300)
    Balloon.TOOLINFO\cbSize=SizeOf(TOOLINFO)
    Balloon\uFlags=#TTF_IDISHWND | #TTF_SUBCLASS
    Balloon\hWnd=GadgetID(Gadget)
    Balloon\uId=GadgetID(Gadget)
    Balloon\lpszText=@Text$
    SendMessage_(ToolTip, #TTM_ADDTOOL, 0, Balloon)
    If Title$ > ""
      SendMessage_(ToolTip, #TTM_SETTITLE, Icon, @Title$)
    EndIf           
  EndIf 
  
EndProcedure
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: PureBasic Assembler Error

Beitrag von Kiffi »

Mok hat geschrieben:War ne veraltete Version
ja, was soll man dazu noch sagen... :roll:

Ich bin raus. Kleiner Tipp noch, damit die Kollegen nicht
im Trüben fischen müssen: Poste einen verkürzten und
komplett lauffähigen Code
, der Dein Problem bei jedem
nachvollziehbar macht. Ansonsten wird das nix...
Hygge
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: PureBasic Assembler Error

Beitrag von edel »

Mok hat geschrieben:>> PB erstellt selber sein Tooltipfenster.
Jo, aber die Stanrd-Tool Tips schauen viel fader aus als die Balloon Tips
Das eine hat mit dem anderen nichts zu tun. Du erstellst deine ToolTips mit #TTM_ADDTOOL
und nicht mit CreateWindowEx.

Stell dir das TooltipControl wie eine LinkedList vor, einmal erstellen und dann nur noch neue
einfuegen. Also war das mit dem "Init" schonmal der bessere Weg.
Im englischen Forum gibts es noch eine Funktion von mir, mit der man das ToolTip-Handle vom
PB Fenster bekommt. Dann erspart man sich noch das CreateWindowEx.


http://www.purebasic.fr/english/viewtop ... 73#p280773
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

Re: PureBasic Assembler Error

Beitrag von ts-soft »

So ganz richtig ist das auch nicht, wenn in PB kein GadgetToolTip genutzt wird, existiert
diese Fensterklasse nicht. Wenn man aber mit PB einen ToolTip erstellt hat, kann man dies
weiter nutzen:

Code: Alles auswählen

EnableExplicit

Structure GadgetGlobals
  CurrentWindow.i
  FirstOptionGadget.i
  DefaultFont.i
  *PanelStack
  PanelStackIndex.l
  PanelStackSize.l
  ToolTipWindow.i
EndStructure

Import ""
  PB_Object_GetThreadMemory(*Mem)
  PB_Gadget_Globals
EndImport

Procedure ToolTipID()
  Protected *gg.GadgetGlobals
  *gg = PB_Object_GetThreadMemory(PB_Gadget_Globals)
  ProcedureReturn *gg\ToolTipWindow
EndProcedure

Procedure BalloonTip(Gadget, Text$, Title$, Icon)
  Protected tooltip = ToolTipID()
  Protected Balloon.TOOLINFO
  SendMessage_(ToolTip, #TTM_SETTIPTEXTCOLOR, GetSysColor_(#COLOR_INFOTEXT), 1)
  SendMessage_(ToolTip, #TTM_SETTIPBKCOLOR, GetSysColor_(#COLOR_INFOBK), 0)
  SendMessage_(ToolTip, #TTM_SETMAXTIPWIDTH, 0, 300)
  Balloon.TOOLINFO\cbSize = SizeOf(TOOLINFO)
  Balloon\uFlags          = #TTF_IDISHWND | #TTF_SUBCLASS
  Balloon\hWnd            = GadgetID(Gadget)
  Balloon\uId             = GadgetID(Gadget)
  Balloon\lpszText        = @Text$
  SendMessage_(ToolTip, #TTM_ADDTOOL, 0, Balloon)
  If Title$ > ""
    SendMessage_(ToolTip, #TTM_SETTITLE, Icon, @Title$)
  EndIf

EndProcedure
; test program
OpenWindow(0, 0, 0, 320, 240, "")
ButtonGadget(1, 10, 10, 80, 40, "Test")
GadgetToolTip(1, "test"); ohne diese Zeile gehts nicht!
BalloonTip(1, "Text", "Titel", #MB_ICONERROR)
Repeat:Until WaitWindowEvent() = #PB_Event_CloseWindow
Gruß
Thomas
Antworten