Systemsteuerungsicon, Windows-Dienste und Umgebungsvariablen

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

Re: Systemsteuerungsicon, Windows-Dienste und Umgebungsvaria

Beitrag von ts-soft »

Vielleicht mal etwas "Modernisieren" :wink:

CompilerOption: Unicode!

Und dann, nicht unbedingt nötig, aber erleichert die Anpassung an 64-Bit, nutze Integer statt Long, zumindest bei Pointern und
Handles. Und EnableExplicit macht das Leben leichter.

Gruß
Thomas
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
Benutzeravatar
TheCube
Beiträge: 169
Registriert: 20.07.2010 23:59
Computerausstattung: Risen 3400G 16MB Win10-64Bit
Wohnort: NRW

Re: Systemsteuerungsicon, Windows-Dienste und Umgebungsvaria

Beitrag von TheCube »

Danke, habe es mal etwas angepasst bzgl. EnableExplicit und ein paar .l -> .i ... hoffentlich richtig.
Mit Unicode=an hatte ich ja schon probiert ohne merkliche Änderung.
Ob es mein Problem [1] schon löst muss ich aber etwas später testen.

Code: Alles auswählen

EnableExplicit
Define Name.s,Info.s

ProcedureDLL.i CPlApplet(hwndCPI.i, uMsg.l, lParam1.l, lParam2.l) 
  Shared Name.s,Info.s 
  
  #CPL_DBLCLK  = 5 
  #CPL_EXIT = 7 
  #CPL_GETCOUNT = 2 
  #CPL_INIT = 1 
  #CPL_INQUIRE = 3 
  #CPL_STOP = 6 
  #CPL_NEWINQUIRE = 8 
  
;   typedef struct tagNEWCPLINFO {
;   DWORD    dwSize;
;   DWORD    dwFlags;
;   DWORD    dwHelpContext;
;   LONG_PTR lpData;
;   HICON    hIcon;
;   TCHAR    szName[32];
;   TCHAR    szInfo[64];
;   TCHAR    szHelpFile[128];
; } NEWCPLINFO, *LPNEWCPLINFO;
  
  Structure NEWCPLINFO 
    dwSize.l 
    dwFlags.l 
    dwHelpContext.l 
    lData.i 
    hIcon.i 
    szName.b[32] 
    szInfo.b[64] 
    szHelpFile.b[128] 
  EndStructure 
  
  Define result,*cp.NEWCPLINFO
  
  Select uMsg 
    Case #CPL_INIT 
      ;beim Initieren die Variablen füllen 
      Name = "CPL-Test"             ;Name der unter dem Icon erscheint   (max. 32) 
      Info = "Ruft nur Notepad auf" ;Info die in der Statusbar erscheint (max. 64) 
      result = 1 
    Case #CPL_GETCOUNT 
      result = 1 ;1 Icon 
    Case #CPL_NEWINQUIRE 
      ;Informationen setzen 
      *cp.NEWCPLINFO = lParam2 
      *cp\dwSize = SizeOf(NEWCPLINFO) 
      *cp\hIcon = ExtractIcon_(0,"CPL-Test.cpl",0) 
      PokeS(@*cp\szName[0], Name) 
      PokeS(@*cp\szInfo[0], Info) 
      result = 0 
    Case  #CPL_DBLCLK 
      ;hier passiert alles was beim Doppelklick auf das Icon passieren soll 
      ;in diesem Fall wird Notepad gestartet 
      RunProgram("Notepad.exe","c:\autoexec.bat", "c:\", 0) 
      result = 0 
    Case #CPL_STOP 
      result = 0 
    Case #CPL_EXIT 
      result = 0 
  EndSelect 
  ProcedureReturn result 
EndProcedure  
Edit:
So kurz auf einem Win7 32-bit angetestet: Das Problem "zeigt nur erste Buchstaben" ist geblieben
und beim Anklicken in der Systemsteuerung gibts eine Windowsmeldung "Programm eventuell nicht richtig installiert".
Aber notepad.exe wird aufgerufen.
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: Systemsteuerungsicon, Windows-Dienste und Umgebungsvaria

Beitrag von ts-soft »

Mit folgender Structure:

Code: Alles auswählen

  Structure NEWCPLINFO
    dwSize.l
    dwFlags.l
    dwHelpContext.l
    lData.i
    hIcon.i
    szName.c[32]
    szInfo.c[64]
    szHelpFile.c[128]
  EndStructure
 
erhalte ich schon mal die Info's in der Systemsteuerung (unter Win10 x64), kann aber notepad nicht starten.
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
Benutzeravatar
TheCube
Beiträge: 169
Registriert: 20.07.2010 23:59
Computerausstattung: Risen 3400G 16MB Win10-64Bit
Wohnort: NRW

Re: Systemsteuerungsicon, Windows-Dienste und Umgebungsvaria

Beitrag von TheCube »

Danke ts-soft, die Änderungen auf einen Zeichentyp (.b -> .c) für die Texte in der Struktur waren der Knackpunkt.
Da kopiere selber noch die C-Struktur aus der MSDN ins Codebeispiel und sah es nicht .... :coderselixir:
Notepad.exe startet bei mir (Win7), mag sein das es auf deinem Win10 ohne Pfad nicht mehr gefunden wird.
Problem [1] also erledigt.

Problem [2] Kein eigenes Icon : Liegt bestimmt daran, das eine Icon-Extraktion aus sich selbst (einer .DLL) nicht klappen kann,
da trotz Compiler Options "use Icon" keine Icon-Daten in eine erstellte DLL eingebettet werden. (?)
Ich meine schonmal eine Software-Lösung gesehen zu haben, muß ich mal stöbern im Forum, Winapi-Library und eigenem Schnipselarchiv.
Wenn ichs schaffe poste ich es hier.

Die Kategorie-Zugehörigkeit der CPL mit anzugeben (Frage [3]) scheint wohl kniffliger zu sein ?
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: Systemsteuerungsicon, Windows-Dienste und Umgebungsvaria

Beitrag von ts-soft »

Da mußte wohl mit den Compiler-Optionen "Resourcen" ein Icons hinzufügen, oder eine Datei nehmen:

Code: Alles auswählen

EnableExplicit
Define Name.s,Info.s

ProcedureDLL.i CPlApplet(hwndCPI.i, uMsg.l, lParam1.l, lParam2.l)
  Shared Name.s,Info.s
 
  #CPL_DBLCLK  = 5
  #CPL_EXIT = 7
  #CPL_GETCOUNT = 2
  #CPL_INIT = 1
  #CPL_INQUIRE = 3
  #CPL_STOP = 6
  #CPL_NEWINQUIRE = 8
 
  Structure NEWCPLINFO
    dwSize.l
    dwFlags.l
    dwHelpContext.l
    lData.i
    hIcon.i
    szName.c[32]
    szInfo.c[64]
    szHelpFile.c[128]
  EndStructure
 
  Define result,*cp.NEWCPLINFO
 
  Select uMsg
    Case #CPL_INIT
      ;beim Initieren die Variablen füllen
      Name = "CPL-Test"             ;Name der unter dem Icon erscheint   (max. 32)
      Info = "Ruft nur Notepad auf" ;Info die in der Statusbar erscheint (max. 64)
      result = 1
    Case #CPL_GETCOUNT
      result = 1 ;1 Icon
    Case #CPL_NEWINQUIRE
      ;Informationen setzen
      *cp.NEWCPLINFO = lParam2
      *cp\dwSize = SizeOf(NEWCPLINFO)
      *cp\hIcon = LoadImage_(0, "d:\test.ico", #IMAGE_ICON, 16, 16, #LR_LOADFROMFILE)
      PokeS(@*cp\szName[0], Name)
      PokeS(@*cp\szInfo[0], Info)
      result = 0
    Case  #CPL_DBLCLK
      ;hier passiert alles was beim Doppelklick auf das Icon passieren soll
      ;in diesem Fall wird Notepad gestartet
      RunProgram("Notepad.exe")
      result = 0
    Case #CPL_STOP
      result = 0
    Case #CPL_EXIT
      result = 0
  EndSelect
  ProcedureReturn result
EndProcedure  
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
Benutzeravatar
TheCube
Beiträge: 169
Registriert: 20.07.2010 23:59
Computerausstattung: Risen 3400G 16MB Win10-64Bit
Wohnort: NRW

Re: Systemsteuerungsicon, Windows-Dienste und Umgebungsvaria

Beitrag von TheCube »

Habe auch eine Lösung fürs Icon .. und obwohl ich mich mit Handles oder Speicheradr. immer schwer tue ..... sie funktioniert soweit ichs sehe.
(.ico file laden war keine Option, weil ich eine 1-File Lösung möchte ... und mit den Resourcen-Thema kenne ich mich nicht aus)

Code: Alles auswählen

; *** Als .Dll compilieren (CompilerOption: Unicode an) und in .cpl umbenennen. Dann in c:\Windows\System32 kopieren ***
EnableExplicit
Define Name.s,Info.s

ProcedureDLL.i CPlApplet(hwndCPI.i, uMsg.l, lParam1.l, lParam2.l) 
  Shared Name.s,Info.s 
  
  #CPL_DBLCLK  = 5 
  #CPL_EXIT = 7 
  #CPL_GETCOUNT = 2 
  #CPL_INIT = 1 
  #CPL_INQUIRE = 3 
  #CPL_STOP = 6 
  #CPL_NEWINQUIRE = 8 
  
  Structure NEWCPLINFO      ;   typedef struct tagNEWCPLINFO {
    dwSize.l                ;   DWORD    dwSize;
    dwFlags.l               ;   DWORD    dwFlags;
    dwHelpContext.l         ;   DWORD    dwHelpContext;
    lData.i                 ;   LONG_PTR lpData;
    hIcon.i                 ;   HICON    hIcon;
    szName.c[32]            ;   TCHAR    szName[32];
    szInfo.c[64]            ;   TCHAR    szInfo[64];
    szHelpFile.c[128]       ;   TCHAR    szHelpFile[128];
  EndStructure              ; } NEWCPLINFO, *LPNEWCPLINFO;
  
  Define result,*cp.NEWCPLINFO
  
  Select uMsg 
    Case #CPL_INIT 
      ;beim Initieren die Variablen füllen 
      Name = "CPL-Test"             ;Name der unter dem Icon erscheint   (max. 32) 
      Info = "Ruft nur Notepad auf" ;Info die in der Statusbar erscheint (max. 64) 
      result = 1 
    Case #CPL_GETCOUNT 
      result = 1 ;1 Icon 
    Case #CPL_NEWINQUIRE 
      ;Informationen setzen 
      *cp.NEWCPLINFO = lParam2 
      *cp\dwSize = SizeOf(NEWCPLINFO) 
      *cp\hIcon = CatchImage(0, ?CPLicon)
      PokeS(@*cp\szName[0], Name) 
      PokeS(@*cp\szInfo[0], Info) 
      result = 0 
    Case  #CPL_DBLCLK 
      ;hier passiert alles was beim Doppelklick auf das Icon passieren soll 
      ;in diesem Fall wird Notepad gestartet 
      RunProgram("Notepad.exe","c:\autoexec.bat", "c:\", 0) 
      result = 0 
    Case #CPL_STOP 
      result = 0 
    Case #CPL_EXIT 
      result = 0 
  EndSelect 
  ProcedureReturn result 
EndProcedure  

DataSection
	CPLicon:
	Data.q $2020000100010000,$02E8000400010010,$0028000000160000,$0040000000200000,$0000000400010000
	Data.q $0000000000000000,$0000000000000000,$0000000000000000,$8000008000000000,$0080008080000000
	Data.q $8080008000800000,$808000C0C0C00000,$FF0000FF00000080,$00FF00FFFF000000,$FFFF00FF00FF0000
	Data.q $000000FFFFFF0000,$0000000000000000,$0000000000000000,$0000000000000000,$0000000000000000
	Data.q $0000000000000000,$0000000000000000,$0000000000000000,$0000000000000000,$0000000000000000
	Data.q $0000000000000000,$3B3B8B0000000000,$0000000000303B3B,$3B3B8B0000000000,$0000000000303B3B
	Data.q $3B3B8B0000000000,$8888000000303B3B,$8888888888888888,$2280008088888888,$2122722227227222
	Data.q $2280002022211222,$2222720200200000,$2280002022222222,$0022720288278078,$2280002002002000
	Data.q $78227202772070A7,$2280702002882780,$2222722222222222,$2280702022222222,$A777770200200000
	Data.q $9280702072A7777A,$2222720288278078,$2280702072222222,$22227202772A70A7,$2280702072020000
	Data.q $2277772222222222,$9280707077028878,$2227720200200000,$2280702072028878,$2227720288278078
	Data.q $2280002072028878,$2227720277207007,$9280807077027707,$2227722272222227,$2280002072222227
	Data.q $A2A7722272222227,$77800020722222A7,$7777777777777777,$8888007077777777,$8888888888888888
	Data.q $0000008088888888,$0000000000000000,$0000000000000000,$0000000000000000,$0000000000000000
	Data.q $0000000000000000,$0000000000000000,$0000000000000000,$0000000000000000,$0000000000000000
	Data.q $0000000000000000,$0000000000000000,$0000000000000000,$0000000000000000,$FFFF000000000000
	Data.q $FFFFFFFFFFFFFFFF,$FCFFFFFFFFFFFFFF,$FCFF3F00FCFF3F00,$0000030000003F00,$0000030000000300
	Data.q $0000000000000300,$0000000000000000,$0000000000000000,$0000000000000000,$4040000000000000
	Data.q $0040030000400008,$0000030000400300,$FFFFFFFFFFFF0300,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
	Data.q $0000FFFFFFFFFFFF
EndDataSection
Jetzt noch den geheimnisvollen Kategorie-Wert/-Ort ohne Registrytricks dazu und wir sind fertig ... <)
wäre dann ggf. auch was für das nächste WinAPI-Library-Update.
Benutzeravatar
TheCube
Beiträge: 169
Registriert: 20.07.2010 23:59
Computerausstattung: Risen 3400G 16MB Win10-64Bit
Wohnort: NRW

Re: Systemsteuerungsicon, Windows-Dienste und Umgebungsvaria

Beitrag von TheCube »

Also das mit der Kategorie ist wohl ohne Registry-Eintrag nicht zu machen ....
irgentwas mit einer CLSID und "System.ControlPanel.Category"="1" (z.B)
Ist aber nicht mehr ganz so wichtig, war mehr "nice to have".

Was richtig nervt ist aber: Obiger Code mit PB 64Bit compiliert tut gar nichts mehr. (?)
Test ist recht einfach:
Mit PB 32bit compiliert zur .dll, umbennen in .cpl, Datei doppelklicken.
-> Startet wie in der Systemsteuerung (bzw. wie eine .exe) unter Win7 32bit und 64bit. Alles ok.

Mit PB 64bit compiliert zur .dll, umbennen in .cpl, Datei doppelklicken.
-> Gar keine Reaktion unter Win7 32bit und 64bit. Auch keinerlei Fehlerrequester.

Habe schon allerlei .i <-> .l Sachen durchprobiert ohne Erfolg ...
Vielleicht kennt ja einer von euch den Grund. /:->
Antworten