AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi hilfe mit dll datei und englischem treat
Thema durchsuchen
Ansicht
Themen-Optionen

hilfe mit dll datei und englischem treat

Ein Thema von ghost007 · begonnen am 27. Feb 2007 · letzter Beitrag vom 27. Feb 2007
Antwort Antwort
Benutzerbild von ghost007
ghost007

Registriert seit: 31. Okt 2005
Ort: München
1.024 Beiträge
 
Delphi 7 Personal
 
#1

hilfe mit dll datei und englischem treat

  Alt 27. Feb 2007, 18:30
Hallo,
ich hab in einem entwicklungsforum für die G15 tastatur von logitech folgenden eintrag mit entsprechendem anhang gefunden:
Zitat:
FILE UPDATED at 02/09/07 1:06 AM

Hi!

Here is the API dll, usable by all programmin languages, which has following functions:

BOOL GetProductString(OUT PVOID Buffer, IN ULONG BufferLength);
--- Should give: "G15 Keyboard"

BOOL SetBgLight(IN INT value);
--- value: 0=off 1=half 2=full

BOOL SetLCDLight(IN INT value);
--- value: 0=off 1=half 2=full

BOOL SetLCDContrast(IN INT value);
--- value: the higher, the more contrast; when value exceedes 43 it is set back to 18, which is the level, the LCDMon.exe sets it to low

BOOL SetMacroKeys(IN BOOL M1, IN BOOL M2, IN BOOL M3, IN BOOL MR);
--- multiple are really possible!

INT GetLight(IN INT value);
--- value: look at values.txt

DWORD SetCallback(IN DWORD lpProc);
--- lpProc: pointer to the callback function:
--- VOID WINAPI keyProc(INT pressedKeys);
---
--- In VB: SetCallback(AddressOf(Keys_Pressed))
--- Public Sub Keys_Pressed(Keys as Long) .....


If the functions succeed, the return value is nonzero.
If the functions fails, the return value is zero. To get extended error information, call GetLastError.


I attached it and hope u can find use with it.


The values.txt showes, what to check for at the callback.
Any questions, just ask!

id2433

P.S.:- the license changed
- there is a program 'mouseLight':
M1 when left
M2 when middle
M3 when right
MR when move (with timer, that it does not flicker)
you can close it with the Hotkey [Win]+[Alt]+[M]
msgbox with keys pressed
Attatchement im anhang.

Ich werd aus dem Post einfach nicht schlau, könnt ihr mir vielleicht weiterhelfen, wie ich die dll datei verwenden kann?

Danke schonmal - Ghost007
Angehängte Dateien
Dateityp: zip lglight_765.zip (8,8 KB, 6x aufgerufen)
Christian
Es gibt möglich Dinge und unmöglich Dinge.
Für unmögliche braucht man lediglich etwas länger.
  Mit Zitat antworten Zitat
Benutzerbild von phreax
phreax

Registriert seit: 1. Mai 2006
Ort: Dresden
147 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: hilfe mit dll datei und englischn treat

  Alt 27. Feb 2007, 18:40
Hallo ghost007,
Das ganz ist so umzusetzen (statische Einbindung der Funktionen mit dynamsich kenn ich mich nicht aus)


NICHT GESTESTET:
Delphi-Quellcode:
//BOOL GetProductString(OUT PVOID Buffer, IN ULONG BufferLength);
function GetProductString(Buffer: PChar; Length: Cardinal): boolean; external 'API.dll';

//zu benuzen:
var Buf: PChar;
begin
GetMem(Buf,255);
if not GetProductString(Buf,255) then showmessage('An error occured')
else showmessage(StrPas(Buf));
FreeMem(Buf);
end;
ich hoffe nun kannst du alle anderen funktionen selbst umsetzen

mfg phreax

EDIT aufräumen (freemem()) vergessen
Und dann war da noch der junge Mann ....
... der unbedingt Schriftsteller werden wollte.
Er wollte Emotionen wecken und die Leute zum weinen bringen.
Sein Traum wurde wahr, er verfasst heute die Fehlermeldungen bei Microsoft!
  Mit Zitat antworten Zitat
Benutzerbild von ghost007
ghost007

Registriert seit: 31. Okt 2005
Ort: München
1.024 Beiträge
 
Delphi 7 Personal
 
#3

Re: hilfe mit dll datei und englischem treat

  Alt 27. Feb 2007, 19:21
öhm, ahja ... sorr, habe noch nie mit sowas gearbeitet kann mir vll noch jmd nen ansatz geben ... den ich vll verstehen kann, bzw. die anderen funktionen (zumindest eine, als bsp) schreiben?
Christian
Es gibt möglich Dinge und unmöglich Dinge.
Für unmögliche braucht man lediglich etwas länger.
  Mit Zitat antworten Zitat
Benutzerbild von phreax
phreax

Registriert seit: 1. Mai 2006
Ort: Dresden
147 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: hilfe mit dll datei und englischem treat

  Alt 27. Feb 2007, 19:30
Zitat von ghost007:
öhm, ahja ... sorr, habe noch nie mit sowas gearbeitet kann mir vll noch jmd nen ansatz geben ... den ich vll verstehen kann, bzw. die anderen funktionen (zumindest eine, als bsp) schreiben?
Also gut hier der Code für eine Beispielanwendung:

immer noch nicht getestet ^^

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;


var
  Form1: TForm1;

//DLL Funktionen
      function GetProductString(Buffer: PChar; Length: Cardinal): boolean; external 'lglight.dll';

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var Buf: PChar;
begin
GetMem(Buf,255);
if not GetProductString(Buf,255) then showmessage('An error occured')
else showmessage(StrPas(Buf));
FreeMem(Buf);
end;

end.
Jetzt siehst du wo die Dll Funktions Header platziert werden, auch alle weiteren werden dort platziert.
Wenn du konkrete probleme beim übersetzen der header hast, dann beschreibe sie bitte konkret...

mfg phreax

EDIT falscher DllName fällt mit auf -_-
Und dann war da noch der junge Mann ....
... der unbedingt Schriftsteller werden wollte.
Er wollte Emotionen wecken und die Leute zum weinen bringen.
Sein Traum wurde wahr, er verfasst heute die Fehlermeldungen bei Microsoft!
  Mit Zitat antworten Zitat
Benutzerbild von ste_ett
ste_ett

Registriert seit: 10. Sep 2004
Ort: Dülmen
464 Beiträge
 
Delphi 7 Professional
 
#5

Re: hilfe mit dll datei und englischem treat

  Alt 27. Feb 2007, 19:38
function GetProductString(Buffer: PChar; Length: Cardinal): boolean; cdecl; external 'API.dll'; Bei einer C-DLL ist im Regelfall "cdecl" die Aufrufkonvention.
Ausnahme ist hierbei Folgendes:
Code:
VOID WINAPI keyProc(INT pressedKeys);
procedure keyProc(pressedKeys: Integer); stdcall; "WINAPI" ist bei C/C++ als "stdcall" definiert.
Stefan
"Geht nicht!" ist keine Fehlerbeschreibung und "Hab ich schon versucht!" keine Antwort!

Hey, it compiles! Ship it!
  Mit Zitat antworten Zitat
Benutzerbild von phreax
phreax

Registriert seit: 1. Mai 2006
Ort: Dresden
147 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: hilfe mit dll datei und englischem treat

  Alt 27. Feb 2007, 19:40
Zitat von ste_ett:
[delphi]
Bei einer C-DLL ist im Regelfall "cdecl" die Aufrufkonvention.
Ausnahme ist hierbei Folgendes:
"WINAPI" ist bei C/C++ als "stdcall" definiert.
Man lernt eben nie aus

thx phreax
Und dann war da noch der junge Mann ....
... der unbedingt Schriftsteller werden wollte.
Er wollte Emotionen wecken und die Leute zum weinen bringen.
Sein Traum wurde wahr, er verfasst heute die Fehlermeldungen bei Microsoft!
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: hilfe mit dll datei und englischem treat

  Alt 27. Feb 2007, 20:20
Moin Christian,

hier noch einmal die Einbindung von Phreax, allerdings kommentiert (und korrigiert )

Delphi-Quellcode:
//BOOL GetProductString(OUT PVOID Buffer, IN ULONG BufferLength);
function GetProductString(const Buffer: PChar; const Length: ULONG): Longbool; stdcall; external 'API.dll';

// Anwendung:

var
  pBuf: PChar;

begin
  pBuf := AllocMem(255);
  try
    if not GetProductString(pBuf,255) then begin
      ShowMessage(SysErrorMessage(GetLastError));
    end else begin
      ShowMessage(trim(pBuf));
    end;
  finally
    FreeMem(pBuf,255);
  end;
end;
Gehen wir mal der Reihe nach durch:
Das const habe ich mir angewöhnt, da es in C keine var-Parameter gibt, wie, z.B., in Delphi. Es ist zwar nicht zwingend erforderlich erleichtert aber oft die Anwendung von Beispielen, die in C geschrieben sind. Ausserdem sieht man oft Deklarationen, in denen ein Parameter, der als Rückgabewert der Funktion dienen soll, durch Angabe von nil ausgelassen werden kann, wenn der Wert nicht von Interesse ist. In Delphi-Übersetzungen findet man hier aber oft var-Parameter in der Deklaration, so dass dieses Weglassen so nicht möglich ist.
Den PChar habe ich mal so gelassen, da er hier Sinn zu machen scheint, PVOID entspricht eigentlich dem Pointer in Delphi.
ULONG kann man so lassen, da es in Delphi deklariert ist (als Cardinal). Ob man sich damit beim Wechsel auf 64-Bit-Compiler Probleme einhandeln kann (cardinal ist der generische, vorzeichenlose Integertyp, also 32-Bit gross bei einem 32-Bit Compiler, 64-Bit bei bei einem 64-Bit Compiler) weiss ich allerdings nicht genau.
IN/OUT sind in den Windows C-Headern als Makros ohne Inhalt deklariert, und dienen nur dokumentatorischen Zwecken, so dass man sie hier weglassen kann.
BOOL entspricht dem Delphi-Typ Longbool, und nicht boolean, da Longbool 4-Byte gross ist, und boolean ist 1-Byte gross. Einen booleschen Typen gibt es in C gar nicht. BOOL ist als int deklariert. Man könnte also eignentlich auch integer nehmen, aber mit BOOL (bzw. Longbool) kann man den Code lesbarer schreiben.
stdcall als Aufrufkonvention habe ich genommen, da diese unter Windows die verbreitetste ist. Es könnte auch cdecl sein.
Das wird man spätestens dann merken, wenn man beim Aufruf der Funktion eine AV erhält
Mit external 'API.DLL' gibt man dann noch die DLL an, in der sich die Funktion befindet.
Man könnte dann noch mit name 'NameDerFunktion' den Namen der Funktion mit angeben, wie er in der DLL lautet (ACHTUNG: Gross-/Kleinschreibung beachten), wenn der Funktionsname davon abweichen soll.
Viele Windows-Funktionen liegen als Ansi- und Widestring Versionen vor, und sind in den DLLs durch den Suffix A bzw. W unterschieden (z.B. MessageBoxA, MessageBoxW). Zur Vereinfachung ist dann, in Delphi, noch die Funktion MessageBox deklariert, wobei es sich um MessageBoxA handelt.
Beispiel:
function MessageBox(.....) : integer; stdcall; external 'user32.dllname 'MessageBoxA'; Nachteil der statischen Einbindung:
Ist die Funktion nicht auf dem Rechner vorhanden, schlägt schon der Programmstart fehl.

Um diese zu verhindern, kann man dann die Funktion dynamisch, also zur Laufzeit einbinden.
Hierzu deklariert man sich erst einmal einen Funktionstypen:

Delphi-Quellcode:
type
  TGetProductString = function(const Buffer: PChar; const Length: ULONG): Longbool; stdcall;
Einbinden kann man die Funktion dann mit

Delphi-Quellcode:
var
  hLib : DWORD;
  GetProductString : TGetProductString;

begin
  hLib := LoadLibrary('API.DLL'); // Versuchen die DLL zu laden
  if hLib = 0 then exit; // bekommen wir kein Handle, konnte die DLL nicht geladen werden
  try
    @GetProductString := GetProcAddress(hLib,'GetProductString'); // Adresse der Funktion auslesen
    if @GetProductString = nil then exit; // Fehlgeschlagen, dann gibt es nichts weiter zu tun
    // Jetzt kann mit der Funktion gearbeitet werden
   
  finally
    FreeLibrary(hLib); // und die DLL wieder entladen, wenn sie nicht mehr benötigt wird.
  end;
end;
Das nur als kurzes Beispiel für das dynamische Einbinden.
Meistens wird man allerdings das Laden und Freigeben der DLL nicht innerhalb der gleichen Routine machen.

Zur Vervollständigung:
INT kannst Du mit integer übersetzen.

Das einzige, was sonst noch schwieriger werden könnte (das übrige müsstest Du jetzt hinbekommen können) ist:
Code:
DWORD SetCallback(IN DWORD lpProc);
--- lpProc: pointer to the callback function:
--- VOID WINAPI keyProc(INT pressedKeys);
Hier finde ich die Deklaration schon etwas merkwürdig. Ich würde es so übersetzen:
function SetCallback(const lpProc : Pointer) : DWORD; stdcall; external 'API.DLL'; da es keinen Sinn macht die Adresse einer Funktion als DWORD anzugeben.
keyProc ist eine Funktion, die Du selber deklarieren musst (siehe z.B., MSDN-Library durchsuchenEnumWindowsProc), beispielsweise so:

Delphi-Quellcode:
function MeineKeyProc(const pressedKeys : integer) : DWORD; stdcall;
begin
  // Was auch immer mit pressedKeys passieren soll
end;
Der Aufruf wäre dann:
SetCallback(@MeineKeyProc); Die Deklaration von MeineKeyProc ergibt sich durch das davor stehende WINAPI. Wenn Du Dir mal die Header-Dateien des PSDK anschaust, die WinDef.h um genau zu sein, wirst Du feststellen, dass hier mit die Aufrufkonvention stdcall festgelegt wird.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:43 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz