![]() |
habe DLL aber nur C++ und VB Beispiele
Hallo zusammen
ich habe eine DLL die ich verwenden will. Der Hersteller der das vertreibt unterstützt aber nur VB und C++. Also sind in seiner Dokumentation auch nur VB und C++ Beispiele dabei. Ich will aber Delphi verwenden also hab ich mal angefangen die C++ Header Files bzw. die entprechende .Bas Datei in Delphi zu übersetzen. Das geht so weit auch. Und einige wenige funktionen kann ich auch schon beutzen (vor allem die ohne Parameter Übeergabe) C++ KMErrorCode EXPORTFCN KMTCPRefreshDevices( void ); // funktioniert in delphi KMErrorCode EXPORTFCN KMTCPGetNumDevices( LPUINT16 lpnNumDevices ); // das auch delphi Function KMTCPRefreshDevices (): Long; cdecl; external 'KmApi32.DLL'; Function KMTCPGetNumDevices (lpnNumDevices : pWord): Long; cdecl; external 'KmApi32.DLL'; aber bei folgender Funktion geht nix C++ /* TCPIP Server Control access functions */ KMErrorCode EXPORTFCN KMTCPGetDeviceInformation(char *lpszNameArray[], char *lpszAddressArray[], char *lpszSNArray[], UINT16 DIPArray[], int nNumDevices ); wie muß ich das hier machen?? es wird nachher in C++ verwendet wie folgt /*------------------------------------------------------------------------*/ unsigned short NumberDevices = 0; /* Force the API to look for devices on the network */ KMTCPRefreshDevices(); /* Get the number of devices found on serial and/or Ethernet */ KMTCPGetNumDevices(&NumberDevices); /* Initialize the array to retrieve all device names, */ /* serial numbers, and IP addresses */ char **NameArray= new char*[NumberDevices]; char **IPArray = new char*[NumberDevices]; char **SNArray = new char*[NumberDevices]; UINT16 *DIPArray = new UINT16[NumberDevices]; for(int j=0;j<NumberDevices;j++) { NameArray[j]=new char[MAX_TCP_NM_LENGTH]; IPArray[j]=new char[MAX_TCP_IP_LENGTH]; SNArray[j]=new char[MAX_TCP_SN_LENGTH]; } /* Retrieve the device information */ KMTCPGetDeviceInformation(NameArray, IPArray, SNArray, DIPArray, NumberDevices); /*------------------------------------------------------------------------*/ und wie muß ich das dan verwenden?? ich hoffe mir kann jemand helfen Gruß Stefan |
Re: habe DLL aber nur C++ und VB Beispiele
Hi Stefan,
diese char-Pointer-Arrays sind in Delphi folgendermaßen zu deklarieren:
Delphi-Quellcode:
und das UINT16-Array so:
TDynPCharArray = array of PChar;
Delphi-Quellcode:
also sähe die Methode-Deklaration folgendermaßen aus:
TDynWordArray = array of Word;
Delphi-Quellcode:
MfG
function KMTCPGetDeviceInformation(NameArray, AddressArray, SNArray: TDynPCharArray; DIPArray: TDynWordArray; NumDevices: Integer); cdecl; external 'KmApi32.dll';
Stevie P.S. Code-Tags würden deinen Beitrag etwas besser lesbar machen. |
Re: habe DLL aber nur C++ und VB Beispiele
Sorry Stevie, komplett falsch. "array of" ist nie zu einem C Typ kompatibel.
Delphi-Quellcode:
Entweder gibt nNumDevices die Laenge der Arrays von PChars bzw UINT16 an oder die Arrays werden durch einen PChar = nil abgeschlossen.
type
PPChar = ^PChar; UINT16 = Word; PUInt16 = ^UINT16; function KMTCPGetDeviceInformation(lpszNameArray: PPChar; lpszAddressArray: PPChar; lpszSNArray: PPChar; DIPArray: PUINT16; nNumDevices: Integer): KMErrorCode; cdecl; |
Re: habe DLL aber nur C++ und VB Beispiele
Zitat:
|
Re: habe DLL aber nur C++ und VB Beispiele
danke robert
weil mit dem Vorschlag von Stevie hatte ich so meine Probleme aber mit den PPChar hab ich auch meine Probleme wie soll ich das denn initialisieren? habs mal so versucht
Code:
aber so geht das nicht aber ich weiß auch gar nicht wie ich das überhaupt anpacken soll mit dem init?
err := KMInitialize;
NumDevices :=0; refresh := KMTCPRefreshDevices(); getNum := KMTCPGetNumDevices(@NumDevices); if getNum = 0 then begin erg := 'Controllers Found '+IntToStr(NumDevices); for lLoop := 0 to NumDevices-1 do begin sNames^[lLoop] := ' '; sIP^[lLoop] := ' '; sSerStr^[lLoop] := ' '; end; err := KMTCPGetDeviceInformation(sNames, sIp, sSerStr, sDipArray, NumDevices); end; ist das nicht sowas wie eine pointer liste? ratloser Gruß Stefan |
Re: habe DLL aber nur C++ und VB Beispiele
Man sollte den Namen der Funktion lesen. Es werden offensichtlich eine Menge Puffer ausgefuellt.
Entsprechend ist der Parameter ein "Buffers: array [0..WASAUCHIMMER] of PChar" und jeder PChar muss seinerseits einen Puffer alloziiert haben. Vermutlich steht in der Dokumentation wie lang so ein Name maximal sein kann. Der Aufruf ist dann "KMTCPGetDeviceInformation(@Buffers[0], ...)" Alternativ kann es sein das in Buffers nur Zeiger auf die intern vorgehaltenen Namen abgelegt werden. Dann ist es nicht noetig die Elemente zu alloziieren, sondern man sollte dann die Elemente mit nil belegen. Da kann aber nur die Dokumentation weiterhelfen. |
Re: habe DLL aber nur C++ und VB Beispiele
Zitat:
Ich habe zuerst C gelernt und bin froh darueber. Im Gegensatz zum Durchschnitts-Pascal-Programmierer lernt man naemlich was ein Zeiger ist. Gerade habe ich mal wieder eine besonders lustige Variablendeklaration in C anbringen koennen. extern const volatile unsigned long int * const SomePointer; Wer diese durchaus sinnvolle Deklaration entraetseln kann der gewinnt meine Hochachtung. |
Re: habe DLL aber nur C++ und VB Beispiele
Danke einstweilenwerde das morgen gleich mal probieren.
Gruß Stefan |
Re: habe DLL aber nur C++ und VB Beispiele
Zitat:
Was du da machst, ist einen Zeiger zu deklarieren, bei dem weder der Wert des Zeigers noch der Wert des Datums, auf der der Zeiger zeigt, innerhalb des Programm verändert werden kann, wohl aber von außen. Sinn machen würde das ganze, wenn du einen Wert, der z.B. per Interrupt gesetzt wurde, in deinem Programm verfügbar machen wilsst und dabei 100% sichergehen musst (naja, 100%ige Sicherheit hast du wohl nie), dass der Wert nicht verfälscht wird. Aber wozu man das braucht, fällt mir auch nicht ein :? |
Re: habe DLL aber nur C++ und VB Beispiele
Hochachtung!
Brauchen kann man das natuerlich. Wie waere es mit einer Interrupt Tabelle in einem Mikrocontroller? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:22 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz