kein AnsiString aus char*
-
Ich möchte vom CAPI-Treiber den Hersteller auslesen. Dazu hole ich mir mit GetProcAddr den Zeiger auf die entsprechende CAPI Fkt.
void __fastcall TForm1::Button1Click(TObject *Sender) { char hersteller[64]; memset(hersteller,'\0', 64); typedef DWORD CF_CAPI_INSTALLED(void); typedef void CF_GET_MANUFACTURER(char *hersteller); CF_CAPI_INSTALLED * cf_CAPI_INSTALLED;//Zgr. auf Fkt. CF_GET_MANUFACTURER * cf_GET_MANUFACTURER; HINSTANCE capiHandle; capiHandle = LoadLibrary("capi2032.dll"); //WinApi Fkt. zum DLL-Laden cf_CAPI_INSTALLED = (CF_CAPI_INSTALLED*)GetProcAddress(capiHandle, "CAPI_INSTALLED"); //Zeiger auf entspr. Fkt holen cf_GET_MANUFACTURER = (CF_GET_MANUFACTURER*)GetProcAddress(capiHandle, "CAPI_GET_MANUFACTURER"); cf_CAPI_INSTALLED(); //Ausführen um CAPI zu init. cf_GET_MANUFACTURER(hersteller); //Hersteller holen. Das klappt!! Nach Fkt.aufruf steht "AVM-GMBH\0" in "hersteller". Memo1->Lines->Add(hersteller); //hier krachts (char[] global -> Zugriffsverl., char[] lokal->Hieroglyphen) }Steh ich nur auf dem Schlauch?
-
Und die Funktionszeiger sind gültig die du da erhälst? Hab nämlich nirgends ne Überprüfung gesehen....
-junix
-
geben die funktionen nen widestring zurück (wchar_t) ?
-
Also ich caste das chararray noch mal nach Ansistring:
z.B:
Memo1->Lines->Add(AnsiString(hersteller));
-
@rautaxe
Hab ich auch schon versucht.@Sunday
Nein, die Fkt. die den Hersteller ausliest, ist nach der CAPI-Doku:VOID APIENTRY CAPI_GET_MANUFACTURER (char * SzBuffer);@junix
Ja, die Zeiger sind gültig. Zum Posten hab ich die Überprüfung weggelassen. Ich überprüfe sie mitif(cf_GET_MANUFACTURER == NULL){ //Fehler }Außerdem würde doch sonst im Char Array nach dem Fkt.aufruf nicht "AVM-GMBH\0" stehen, oder?

Ich denke langsam, dass es ein Problem mit dem C++ Builder ist...
-
Eine Frage: Sollte der Funktionszeiger
typedef DWORD CF_CAPI_INSTALLED(void);nicht so aussehen?[cpp]typedef DWORD *(CF_CAPI_INSTALLED)(void);[/cpp]
-
Stimmt natürlich... Gaube allerdings nicht, dass es ein Problem des BCB ist... Was steht in der Doku zu der Funktion? Was genau macht die mit dem Zeiger?
-
Aus der CAPI-Doku:
Description
With this operation the application obtains the manufacturer identification of
COMMON-ISDN-API (DLL). SzBuffer is a pointer to a buffer of 64 bytes.
COMMON-ISDN-API copies the identification string, coded as a zero-terminated
ASCII string, to this buffer.Function call:
VOID APIENTRY CAPI_GET_MANUFACTURER (char * SzBuffer);Parameter Comment
SzBuffer Pointer to a buffer of 64 bytesSchon seltsam, oder? Konnte irgendjemand das Problem nachstellen?
-
da ich leider nicht mit CAPI beschäftigt bin, kann ich da wenig tun um das nachzustellen... Also wenn du die Funktion verlässt, stehen da hieroglyphen drin?
-junix
-
Ja, sobald ich versuche das char-Array (in dem unmitelbar nach dem Funktionsaufruf der richtige String steht) z.B. in ein Memo zu schreiben. Danach stehen nur noch Hieroglyphen im char-Array bzw. das Programm stürzt mit einer Zugriffsverletzung ab;
-
Hallo,
Probier's mal so :
typedef DWORD CF_CAPI_INSTALLED(void); typedef void CF_GET_MANUFACTURER(char *hersteller); // char* hersteller = new char[64]; memset(hersteller, '\0', 64); CF_CAPI_INSTALLED * cf_CAPI_INSTALLED;//Zgr. auf Fkt. CF_GET_MANUFACTURER * cf_GET_MANUFACTURER; HINSTANCE capiHandle; // WinApi Fkt. zum DLL-Laden capiHandle = LoadLibrary("capi2032.dll"); if (capiHandle) { // Zeiger auf entspr. Fkt holen cf_CAPI_INSTALLED = (CF_CAPI_INSTALLED*) GetProcAddress(capiHandle, "CAPI_INSTALLED"); cf_GET_MANUFACTURER = (CF_GET_MANUFACTURER*)GetProcAddress(capiHandle, "CAPI_GET_MANUFACTURER"); // Ausführen um CAPI zu init. if (cf_CAPI_INSTALLED) cf_CAPI_INSTALLED(); // Hersteller holen. if (cf_GET_MANUFACTURER) cf_GET_MANUFACTURER(hersteller); } // AnsiString HerstellerStr = hersteller; Memo1->Lines->Add(HerstellerStr); delete hersteller;Bis dann denn,

Nash
-
Wenn schon new [] dann bitte auch delete []
Danke.
-
Hallo,
Tja nun... hab' ich übersehen...

Ich benutze dieses "new char[...]"-Kramzeugs nicht so häufig, da vergißt man sowas schonmal.Bis dann denn,

Nash
-
Recht vielen Dank, Nash !!!
Das wars
