| Autor |
Nachricht |
Shyran
Hält's aus hier
Beiträge: 15
|
Verfasst: Di 22.11.11 14:57
Huhu ihr lieben Hilfswilligen
Aus einer Application Note von Silabs habe ich die Beschreibung beispielhaft folgender Funktion, die in einer mitgeliferten DLL enthalten ist:
===
- 5.1. CP210x_GetNumDevices
- Description: This function returns the number of CP210x devices connected to the host.
- Supported Devices: CP2101, CP2102, CP2103, CP2104, CP2105
- Location: CP210x Manufacturing DLL
- Prototype: CP210x_STATUS CP210x_GetNumDevices( LPDWORD NumDevices )
- Parameters: 1. NumDevices—Address of a DWORD that will contain the number of devices.
- Return Value: CP210x_STATUS=CP210x_SUCCESS,
CP210x_DEVICE_NOT_FOUND,
CP210x_INVALID_PARAMETER
===
Daraus ergab sich nun für mich folgender Code:
Aber schon direkt nach Start des Programmes hängt sich dieses auf. Ich vermute mal, ich habe beim Parameter übergeben etwas falsch gemacht, aber wie geht es richtig? Mehr über die DLL als solches weiß ich nicht, aufgrund der Deklaration in der Application Note vermute ich mal, dass diese in C geschrieben wurde.
Liebe Grüße,
-Shyran
|
| |
|
|
Werbung ausblenden? Dann registriere Dich kostenlos.
Weitere Gründe für eine Registrierung.
Werbung ausblenden? Dann registriere Dich kostenlos.
Weitere Gründe für eine Registrierung.
|
|
Luckie
       
Beiträge: 11803
Erhaltene Danke: 146
WindowsXP Professional SP2
BDS2006, VS C++ Express, Eclipse (Java), Flex (Flash, AS)
|
Verfasst: Di 22.11.11 15:27
Was heißt "aufhängen"? Kommt eine Fehlermeldung oder was anderes brauchbares? Und iw kommst du auf die Aufrufkonvention cdecl?
_________________ Gruß Michael
|
| |
|
|
Shyran 
Hält's aus hier
Beiträge: 15
|
Verfasst: Di 22.11.11 16:07
Nun, aufhängen:
Wenn Du mit dem Fehler etwas anfangen kannst, mehr hätte ich nicht parat.
stdcall hatte ich standardmäßig probiert, mit dem gleichen Ergebnis leider.
-Shyran
|
| |
|
|
GuaAck
      
Beiträge: 52
Erhaltene Danke: 5
Win XP
Delphi 7 Prof.
|
Verfasst: Di 22.11.11 21:12
Das VAR fehlt vermutlich, in lpdwNumDevices soll ja etwas zurück!!
Jetzt interpretiert die DLL den (zufällig vorhandenen Wert) on lpdwNumDevices als Adresse und verscuht "in die Wüchte" zu schreiben.
function CP210x_GetNumDevices(VAR lpdwNumDevices: LPDWORD): integer; cdecl; external 'CP210xManufacturing.dll';
Gruß
GuaAck
Für diesen Beitrag haben gedankt: Shyran
|
| |
|
|
Luckie
       
Beiträge: 11803
Erhaltene Danke: 146
WindowsXP Professional SP2
BDS2006, VS C++ Express, Eclipse (Java), Flex (Flash, AS)
|
Verfasst: Di 22.11.11 21:59
_________________ Gruß Michael
Für diesen Beitrag haben gedankt: Shyran
|
| |
|
|
bummi
      
Beiträge: 979
Erhaltene Danke: 124
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: Di 22.11.11 23:21
wenn die DLL das tut was der Name vermute lässt, ist das gehupft wie gehechtelt
_________________ Das Problem liegt üblicherweise zwischen den Ohren
DRY DRY KISS
Für diesen Beitrag haben gedankt: Shyran
|
| |
|
|
Shyran 
Hält's aus hier
Beiträge: 15
|
Verfasst: Mi 23.11.11 11:02
Guten Morgen,
erstmal herzlichen Dank für die bereits investierte Zeit und Mühe an euch um das Thema hier.
Ich habe nun Luckie's Prototyp genutzt wie oben geschrieben und habe ebenso mal bummi's Prozeduren eingebunden. Zumindest der Compiler schimpft nicht mehr, das Programm läuft durch. Allerdings muss ich jezt sagen, dass sich mir der Sinn gar nicht erschließt, speziell natürlich beim Beispiel bummi's ?
Die Funktion sollte mir doch wohl eigentlich die Anzahl (der Devices) zurückgeben, wenn ich dann zuvor in die Variable eine 20 hineinschreibe - wo ist da dann der Sinn?
ggf. stehe ich auch auf einem großen Gartenschlauch, für einen Stubs von selbigem würde ich erneut danke sagen
-Shyran
PS Noch eine Anfängerfrage: Was bedeutet die Schreibweise "lpdwNumDevices^:= 20;" ? Also der Akzent dort? Der accent circonflex ?
PPS: Anfängerfrage ignorieren, bissi Syntax verstehen half mir dabei schon 
|
| |
|
|
Blup
       
Beiträge: 26
Erhaltene Danke: 12
|
Verfasst: Mi 23.11.11 11:25
bummi wollte vermutlich nur darauf hinweisen, beide Deklarationen sind gültig:
Wenn der Variablen dwNumDevices vor dem Aufruf nichts zugewiesen wurde, könnte der Compiler aber eine Warnung ausgeben. Deshalb würde ich so deklarieren:
Für diesen Beitrag haben gedankt: Shyran
|
| |
|
|
Shyran 
Hält's aus hier
Beiträge: 15
|
Verfasst: Mi 23.11.11 12:04
Ah okay!
Wie muss ich dabei nun die eigentliche Funktion aufrufen? Also die CP210x_GetNumDevices ? Dort muss ich doch eine Adresse nun angeben, an der nach dem Aufruf der Funktion doch wohl dann diese Anzahl ->"This function returns the number of CP210x devices connected to the host." befindet, richtig?
Tante Edith sagt noch:
Ich probierte nun zunächst mal
wobei sich das Programm nach Buttonclick aufhängte.
Im Anschluss ersetzte ich das cdecl durch stdcall:
Immerhin tut der Knopf nun etwas, liefert mir aber als Ergebnis eine "0". Sind aber nachweislich 2 Geräte angeschlossen, lt. Gerätemanager.
-Shyran
|
| |
|
|
jaenicke
      
Beiträge: 15841
Erhaltene Danke: 741
XP, W7 x64 (Chrome, IE9, FF), Debian, (OSX 10.7)
RAD XE 2, Java (NB), C++, C# (VS 2010), JS/HTML, PHP, Lazarus
|
Verfasst: Mi 23.11.11 12:58
Du gibst ja auch i statt t aus.
Das ist ja der Status, und die 0 dürfte CP210x_SUCCESS sein, also alles ok.
// EDIT:
Wie wäre es so?
Für diesen Beitrag haben gedankt: Shyran
|
| |
|
|
Shyran 
Hält's aus hier
Beiträge: 15
|
Verfasst: Mi 23.11.11 13:11
Mensch ... ich sehe schon ich bin total verwirrt gewesen, aber nun fällt es mir wie Schuppen von den Augen - Du hast natürlich völlig Recht! Der Rückgabewert entspricht dem Status, wer er auch in der Application Note beschrieben ist und ist demnach - natürlich! - derzeit "0", weil alles in Ordnung ist und funktioniert.
Mir ist auch eben erst, als ich mir mal den Inhalt der Variablen im Debugger anschaut klar geworden "Mensch, in t steht ja verdächtigerweise eine 2" - guck an ... und dann, klar, wenn ich nun die Funktion simpel aufrufe per
Steht natürlich in t exakt die gesuchte Anzahl nach Ausführung.
Wald ... Bäume ... herzlichen Dank, nun spiele ich mal weiter herum. Den Code-Schnippsel von Dir, jaenicke schnappe ichmir umgehend, heißen Dank!
|
| |
|
|
Shyran 
Hält's aus hier
Beiträge: 15
|
Verfasst: Mi 23.11.11 15:25
So nach und nach kämpfe ich mich durch die verschiedenen Funktionen der DLL, zwei weitere konnte ich nun selbständig einbinden und die funktionieren, nun sitze ich an:
===
- 5.20 CP210x_GetDeviceProductString
- Description: Returns the Product Description String of the String Descriptor of a CP210x device. If the ConvertToASCII parameter is set, the string will be converted to ASCII format before being returned to the caller. The character size limit (in characters, not bytes), NOT including a NULL terminator, is CP210x_MAX_PRODUCT_STRLEN.
- Supported Devices: CP2101, CP2102, CP2103, CP2104, CP2105
- Location: CP210x Manufacturing DLL
- Prototype: CP210x_STATUS CP210x_GetDeviceProductString( HANDLE Handle, LPVOID Product, LPBYTE Length, BOOL ConvertToASCII=TRUE )
- Parameters: 1. Handle—Handle to the device to close as returned by CP210x_Open().
2. Product—Pointer to a buffer returning the Product String value.
3. Length—Pointer to a BYTE value returning the length of the string in characters (not bytes), NOT including a NULL terminator.
4. ConvertToASCII—Boolean flag that tells the function whether the string needs to be converted to ASCII before it is returned to the caller. The flag is set to TRUE by default (i.e., the caller is expecting the string in ASCII format).
- Return Value: CP210x_STATUS=CP210x_SUCCESS,
CP210x_INVALID_PARAMETER,
CP210x_INVALID_HANDLE,
CP210x_DEVICE_IO_FAILED
===
Sprich natürlich Deklaration und im folgenden auch der Funktionsaufruf sin derneut meine Sorgen. Hab's mal bisher so versucht:
Ergebnis ist eine Zugriffsverletzung an Adresse sowieso.
LPVoid entspricht ja offenbar einem Zeiger in Delphi. Wo ist hier nun mein Denkfehler? Wie komme ich an den Productstring?
|
| |
|
|
guinnes
       
Beiträge: 173
Erhaltene Danke: 9
|
Verfasst: Mi 23.11.11 15:31
Du brauchst ein LPByte für die Länge, also ein PByte
Für diesen Beitrag haben gedankt: Shyran
|
| |
|
|
Shyran 
Hält's aus hier
Beiträge: 15
|
Verfasst: Mi 23.11.11 16:29
Okay danke, logisch. Steht ja auch im Prototyp ... *seufz*.
Deklaration also geändert in:
Wie komme ich nun an meine Daten dort?
Was muss hier nun hin, um an den eigentl. String zu gelangen (und den in "s" zu schieben)?
Danke!
|
| |
|
|
guinnes
       
Beiträge: 173
Erhaltene Danke: 9
|
Verfasst: Mi 23.11.11 16:48
1. Mach aus deinem Pointer einen PChar und
2. reserviere die xx Bytes für den PChar.
3. Die Reservierte Länge schreibst du in deinen PByte als Initwert.
( So oder so ähnlich wird das eigentlich auch in der Win-API gemacht )
Aus der Hilfe :
| Zitat: | In bestimmten Fällen liegt eine lokale String-Variable vor, die durch den Aufruf einer Funktion initialisiert werden muß, die ihrerseits einen PChar als Parameter entgegennimmt. Eine mögliche Lösung ist die Erstellung eines lokalen array of char, das dann an die Funktion übergeben wird. Nach Ausführung der Funktion kann die Variable einem String zugewiesen werden:
// MAX_SIZE ist hier eine vordefinierte Konstante
var
i: Integer;
buf: array[0..MAX_SIZE] of char;
S: string;
begin
i := GetModuleFilename(0, @buf, SizeOf(buf)); // Behandelt @buf als PChar
S := buf;
// Anweisungen
end; |
Zuletzt bearbeitet von guinnes am Mi 23.11.11 17:02, insgesamt 1-mal bearbeitet
|
| |
|
|
jaenicke
      
Beiträge: 15841
Erhaltene Danke: 741
XP, W7 x64 (Chrome, IE9, FF), Debian, (OSX 10.7)
RAD XE 2, Java (NB), C++, C# (VS 2010), JS/HTML, PHP, Lazarus
|
Verfasst: Mi 23.11.11 16:54
Die Länge ist hier ja mit CP210x_MAX_PRODUCT_STRLEN vorgegeben. Insofern ist wohl das am einfachsten: Ich würde aber den zweiten Parameter gleich als PAnsiChar deklarieren.
Zuletzt bearbeitet von jaenicke am Mi 23.11.11 17:12, insgesamt 1-mal bearbeitet
|
| |
|
|
Shyran 
Hält's aus hier
Beiträge: 15
|
Verfasst: Mi 23.11.11 17:06
Lieben Dank erstmal für die weiteren Stubse in die richtige Richtung, morgen stürze ich mich weiter auf's Thema, bis dahin herzlichen Dank!
|
| |
|
|
|