AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Hardware einbinden

Ein Thema von homer777 · begonnen am 30. Dez 2007 · letzter Beitrag vom 3. Jan 2008
Antwort Antwort
homer777

Registriert seit: 29. Dez 2007
5 Beiträge
 
#1

Hardware einbinden

  Alt 30. Dez 2007, 20:06
Hallo ich bin absoluter Delphi-Neuling. Ich versuche über Delphi eine Hardware anzusprechen. (RedLab1008 http://www.meilhaus.de/index.php?id=...ash=14f3c58c63)
Ich habe hierfür vom Hersteller eine Universal libery mit verschiedenen Dll´s und LIB-Dateien sowie ein paar Beispielprogramme für Delphi. Diese Beispielprogramme kann ich öffnen und mir den Code anschauen, doch wenn ich sie compiliere, kommen immer Fehlermeldungen.
Wie gesagt bin ich Delphi-Neuling und habe keine Ahnung wie ich an die Sache rangehen soll:
Konkrete Fragen sind:

- Wie binde ich die Bibliothek (nennt man das so in Delphi) in mein Programm ein?
Hierfür habe ich folgendes gefunden? (Hilft mir aber nicht weiter)
Code:
Borland C®/C++ For Windows
For 32-bit Borland (or Inprise) C/C++ compilers, include the Universal Library header file CBW.H in your program and link with the import library file CBW32BC.LIB.
When using the 16-bit Borland C/C++, use a tool called IMPLIB to generate an OMF-style import library that your application can link with. For 16-bit users, IMPLIB accepts a DLL (CBW.DLL) as input and creates an OMF-style import library (BCBW.LIB), You can run IMPLIB on CBW.DLL to emit a 16-bit OMF-style import library (BCBW.LIB).
Borland C/C++ Example Programs
The non-Windows C examples provide an extensive set of examples. These can be compiled as 32-bit console applications using the MAKEBC32.BAT file.
Delphi Example Programs
A complete set of Delphi example programs is included in the DELPHI folder of the Universal Library installation directory. Each program illustrates the use of one Universal Library function from within a Delphi program. The .PAS files contain the programs. The corresponding .DPR file is the Project file used to build the program in a 16 bit or 32 bit Delphi environment.
In 16-bit Delphi environments, use the CBW.DLL header. In 32-bit Delphi environments, use the cbw32.dll header. Conditionals within the example programs determine which of the DLLs is used.
Where integers are passed by reference to a Universal Library function, you should use the SmallInt data type in 32-bit environments. The relevant functions are defined this way in the 32-bit header, so if you try to pass an Integer data type you will get a compiler error.
- Wie finde ich heraus welche Funktion es gibt?
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

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

Re: Hardware einbinden

  Alt 30. Dez 2007, 20:40
Moin Homer,

erst einmal herzlich willkommen hier in der Delphi-PRAXiS.

Einbinden kannst Du Funktionen aus DLLs auf zwei Wegen: Statisch oder dynamisch.

Statisch heisst:
Du deklarierst die Funktion, wie eine "normale" Funktion, teilst dem Compiler aber mit, dass er für die Implementierung nicht in Deinem Programm suchen muss, sondern die Funktion in einer DLL findet.

Beispiel:

  function GetAdaptersInfo(const ApAdapterInfo : PIP_ADAPTER_INFO;const ApOutBufLen : PULONG) : DWORD; stdcall; external 'IPHLPAPI.DLLname 'GetAdaptersInfo'; Die Angabe der Aufrufkonvention (hier stdcall) sollte in der Dokumentation der DLL enthalten sein.
Mit external '<Name der DLL>' wird angegeben, wie die DLL heisst, aus der man die Funktion importieren will.
Der name der Funktion muss nur mit angegeben werden, wenn man einen Funktionsnamen verwenden will, der von dem der Funktion in der DLL abweicht (und sei es auch nur durch eine andere Gross-/Kleinschreibung). In obigem Beispiel hätte also name 'GetAdaptersInfo' entfallen können.

Dynamisch heisst:
Die Funktion wird erst zur Laufzeit tatsächlich eingebunden.

Beispiel (die gleiche Funktion wie oben, nur eben dynamisch eingebunden):

Delphi-Quellcode:
// Einen Typ deklarieren, der die Funktionsdeklaration enthält
type
  TcsGetAdaptersInfo = function(const ApAdapterInfo : PIP_ADAPTER_INFO;const ApOutBufLen : PULONG) : DWORD; stdcall;

// Eine Variable deklarieren, die die Adresse der Funktion aufnehmen soll
var
  GetAdaptersInfo : TcsGetAdaptersInfo;
  hDLL : DWORD;

// Dann muss noch die Funktionsadresse aus der DLL ermittelt werden
// Dies kann, z.B., im Implementation-Abschnitt einer Unit erfolgen

initialization
begin
  // Handle auf die DLL holen.
  // Hierbei darf auch ein Pfad angegeben werden, um die Position der gewünschten DLL genau zu bestimmen.
  hDLL := LoadLibrary('IPHLPAPI.DLL');
  if hDLL <> 0 then begin
    // wenn ein gültiges Handle (<> 0) zurückgegeben wurde, kann jetzt die Adresse der Funktion ermittelt werden
    // Wichtig: Die schreibweise (Gross-/Kleinschreibung) muss exakt eingehalten werden
    @GetAdaptersInfo := GetProcAddress(hDLL,'GetAdaptersInfo');
    if @GetAdaptersInfo = nil then begin
      MessageBox(0,'GetAdaptersInfo nicht gefunden','FEHLER',MB_ICONERROR or MB_OK);
      fFatalError := true;
    end;
    // Wenn kein Fehler aufgetreten ist, kann die Funktion, jetzt so benutzt werden, wie jede andere auch.


// Später muss dann die DLL auch wieder freiggegeben werden

finalization
begin
  if hDLL <> 0 then begin
    FreeLibrary(hDLL);
  end;
Es empfiehlt sich auf jeden Fall auch die Dokumentation zu den Funktionen zu lesen (z.B. MSDN-Library durchsuchenLoadLibrary)

Bei der statischen Methode hat man zwar weniger zu schreiben, hat aber auch den Nachteil, dass das Programm gar nicht erst startet (bzw. man erhält eine Fehlermeldung, und das Programm beendet sich gleich wieder), wenn die Funktion nicht importiert werden kann.
Wenn man eine Funktion dynamisch importiert, kann man beim Programmstart auf derartige Probleme eingehen, und evtl. Alternativen verwenden, zur Nachinstallation auffordern, oder einfach den Funktionsumfang des Programmes einschränken.

[EDIT]
Um herauszufinden, welche Funktionen enthalten sind, müsstest Du wohl mal die Dokumentation studieren.
Wie diese dann korrekt eingebunden werden können (z.B., Aufrufkonvention) kannst Du wohl auch den genannten Beispielen entnehmen
[/EDIT]
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
homer777

Registriert seit: 29. Dez 2007
5 Beiträge
 
#3

Re: Hardware einbinden

  Alt 30. Dez 2007, 21:24
Hey Danke für die schnelle Antwort!! Ich hab jetzt schon mal ne Idee bekommen. Werde jetzt erstmal die Dokumentation durcharbeiten.
  Mit Zitat antworten Zitat
homer777

Registriert seit: 29. Dez 2007
5 Beiträge
 
#4

Re: Hardware einbinden

  Alt 2. Jan 2008, 16:36
Hallo!! Ich habe die Dokumentation durchgelesen, und wollte zum Test die Funktion
cbFlashLED() aufrufen. Folgendes habe ich dazu in der Doku gefunden:

Code:

cbFlashLED()
Causes the LED on a USB device to flash.
Function prototype:
C/C++: int cbFlashLED (int BoardNum);
Visual Basic: Function cbFlashLED (ByVal BoardNum&) as Long
Delphi: function cbFlashLED (BoardNum:Integer):Integer;

Arguments:
BoardNum The board number of the USB device whose LED will flash.

BoardNum The board number used to collect the data. BoardNum may be 0 to 99 (0 to
9 for the 16-bit version of Universal Library). Refers to the number
associated with the board used to collect the data when it was installed
with the InstaCal. configuration program
Mein Programm sah so aus(Ausschnitte)

Code:

function cbflashLED(BoardNum:Integer):Integer;StdCall;
external 'CBW32.DLL' name 'cbflashLED';
Nach das nicht geklappt hatte, habe ich Deklaration so versucht:

Code:

function cbflashLED(BoardNum:Integer):Integer;
external 'CBW32.DLL' name 'cbflashLED';
Code:
...
procedure TSDIAppForm.Button1Click(Sender: TObject);
begin
   cbFlashLED(1);
end;
Bei beiden Version gab es den folgenden Fehler:

"Der Objektverweis wurde nicht auf eine Objektinstanz gelegt"

Weiss jemand was ich falsch gemacht habe?

Muss ich die DLL an einen bestimmten Ort kopieren? Muss ich noch etwas im Interface
einbinden?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Hardware einbinden

  Alt 2. Jan 2008, 17:54
Versuch doch lieber erst, die Funktion dynamisch einzubinden. Über GetLastError kannst Du im Fehlerfall zumindest einen Ansatz zur Suche gewinnen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

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

Re: Hardware einbinden

  Alt 2. Jan 2008, 17:57
Moin Homer,

also diese Deklaration

function cbflashLED(BoardNum:Integer):Integer;StdCall; external 'CBW32.DLLname 'cbflashLED'; enthält nicht den korrekten Namen der Funktion. Laut Doku ist der cbFlashLED (also mit grossem F).
Wenn Du name angibst, kann der Funktionsname frei gewählt werden, wenn Du es weglässt, muss er korrekt geschrieben angegeben werden.

Vielleicht ist es in meinem obigen Beitrag nicht so ganz herausgekommen:
Die Schreibweise der Funktionsnamen muss exakt der entsprechen, die in der DLL enthalten ist (incl. Gross-/Kleinschreibung).
Mit der o.g. Deklaration dürfte das Programm eigentlich nicht starten.

Damit die DLL gefunden wird, kannst Du sie in das Programmverzeichnis kopieren, oder auch in das System32

So:
function cbflashLED(const BoardNum:Integer):Integer;StdCall; external 'CBW32.DLLname 'cbFlashLED'; müsste es eigentlich funktionieren.
(da C keine var- und Wert-Parameter kennt, schreibe ich immer const davor)

Leider kann ich dem Ausschnitt aus der Dokumentation nicht entnehmen, welche Aufrufkonvention verwendet werden soll.
Eventuell ist stdcall falsch und muss durch cdecl ersetzt werden.
Vielleicht findest Du ja hierfür nähere Angaben in den Beispielprogrammen.
Ausserdem könnte man das auch den, aller voraussicht nach, mitgelieferten Header-Dateien entnehmen (*.h/*.hpp)
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
homer777

Registriert seit: 29. Dez 2007
5 Beiträge
 
#7

Re: Hardware einbinden

  Alt 2. Jan 2008, 18:10
@ Christian Seehase:
Vielen Dank!!! Lag wirklich am kleinen f.
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#8

Re: Hardware einbinden

  Alt 2. Jan 2008, 19:00
Zitat von homer777:
"Der Objektverweis wurde nicht auf eine Objektinstanz gelegt"
Hu? Das klingt für mich nach einer .netten NullReferenceException. Verwendest du (versehentlich) Delphi.Net ?
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
homer777

Registriert seit: 29. Dez 2007
5 Beiträge
 
#9

Re: Hardware einbinden

  Alt 3. Jan 2008, 11:23
Ich hoffe das ich Win32 verwende... Aber das läuft ja jetzt, nachdem die Groß-und Kleinschreibung beachtet habe!
  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 21:30 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