Dll funktion verursacht invalid pointer operation
-
ich ahb ne dll geschrieben und beim aufruf der funktion wird ein 'invalid pointer operation' fehler zurück geliefert. wenn ich das ganze jedoch in einem
try{blaBlaDllFunktion()catch(...){}
mache, funktioniert alles einwandfrei, jedoch kann das nicht die lösung sein *g*
ich hab keine ahnung was das sein könnte
-
Ich glaube nicht, dass alles einwandfrei funktioniert, wenn deine Funktion sonst eine ungültige Zeigeroperation meldet...
Aber mal ehrlich. Was erwartest du jetzt für ne Antwort von uns? Wir kennen deine Funktion ja (noch?) nicht?!?
-junix
-
die cpp
#include "crypto.h" String FBCrypto::enCrypt(String Text) { //Base64-Tabelle besteht aus 64 druckbaren Zeichen: const char Base64Table[64]= "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; AnsiString slRetVal; char * buftoenc = Text.c_str(); int bufsize = Text.Length() + 1; char * encbuf = new char[Text.Length() * 5]; encbuf[0] = '\0'; int ilStrLen = -1; int i=0; int b64byte[5]; unsigned char *buftemp; //AnsiString slRetVal = EmptyStr; //Speicher für den temporären String reservieren: buftemp=(unsigned char *)malloc(bufsize+2); strcpy(buftemp,buftoenc); if (fmod(bufsize,3)==1) { buftemp[bufsize]='\0'; buftemp[bufsize+1]='\0'; } if (fmod(bufsize,3)==2)buftemp[bufsize]='\0'; while (i<bufsize) { b64byte[0]=buftemp[i]>>2; b64byte[1]=((buftemp[i]&3)<<4)|(buftemp[i+1]>>4); b64byte[2]=((buftemp[i+1]&0x0F)<<2)|(buftemp[i+2]>>6); b64byte[3]=buftemp[i+2]&0x3F; encbuf[i+(i/3)]=Base64Table[b64byte[0]]; encbuf[i+(i/3)+1]=Base64Table[b64byte[1]]; encbuf[i+(i/3)+2]=Base64Table[b64byte[2]]; encbuf[i+(i/3)+3]=Base64Table[b64byte[3]]; i+=3; } free(buftemp); if (fmod(bufsize,3)==0) ilStrLen = bufsize*8/6; else if (fmod(bufsize,3)==1) ilStrLen = ((bufsize+2)*8/6)-2; else if (fmod(bufsize,3)==2) ilStrLen = ((bufsize+1)*8/6)-1; else ilStrLen = -1; if(ilStrLen > 0) slRetVal = AnsiString(encbuf).SubString(1, ilStrLen); if(encbuf != NULL) { delete encbuf; encbuf = NULL; } return slRetVal; } String FBCrypto::deCrypt(String Text) { //Base64-Tabelle besteht aus 64 druckbaren Zeichen: const char Base64Table[64]= "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; AnsiString slRetVal; char * buftodec = Text.c_str(); int bufsize = Text.Length() + 1; char * decbuf = new char[Text.Length() * 5]; decbuf[0] = '\0'; int ilStrLen = -1; //AnsiString slRetVal = EmptyStr; int i=0; unsigned char binbyte[4]; int cpos[5]; unsigned char *buftemp; //Speicher für den temporären String reservieren: buftemp=(unsigned char *)malloc(bufsize); strcpy(buftemp,buftodec); if (fmod(bufsize,4)==1) { buftemp[bufsize]='\0'; buftemp[bufsize+1]='\0'; buftemp[bufsize+2]='\0'; } if (fmod(bufsize,4)==2) { buftemp[bufsize]='\0'; buftemp[bufsize+1]='\0'; } if (fmod(bufsize,4)==3)buftemp[bufsize]='\0'; while (i<bufsize) { cpos[0]=strchr(Base64Table,buftemp[i])-Base64Table; cpos[1]=strchr(Base64Table,buftemp[i+1])-Base64Table; cpos[2]=strchr(Base64Table,buftemp[i+2])-Base64Table; cpos[3]=strchr(Base64Table,buftemp[i+3])-Base64Table; binbyte[0]=((cpos[0]<<2)|(cpos[1]>>4)); binbyte[1]=((cpos[1]<<4)|(cpos[2]>>2)); binbyte[2]=(((cpos[2]&0x03)<<6)|(cpos[3]&0x3f)); decbuf[i-(i/4)]=binbyte[0]; decbuf[i-(i/4)+1]=binbyte[1]; decbuf[i-(i/4)+2]=binbyte[2]; i+=4; } free(buftemp); if (fmod(bufsize,4)==0) ilStrLen = bufsize*6/8; else if (fmod(bufsize,4)==1) ilStrLen = ((bufsize+3)*6/8)-3; else if (fmod(bufsize,4)==2) ilStrLen = ((bufsize+2)*6/8)-2; else if (fmod(bufsize,4)==3) ilStrLen = ((bufsize+1)*6/8)-1; else ilStrLen = -1; if(ilStrLen > 0) slRetVal = AnsiString(decbuf).SubString(1, ilStrLen); if(decbuf != NULL) { delete decbuf; decbuf = NULL; } return slRetVal; }
und die h
#ifndef _FBCRYPTO_ #define _FBCRYPTO_ #include <system.hpp> #include <math.h> //---------------------------------------------------------------------------- class FBCrypto { public: String enCrypt(String Text); String deCrypt(String Text); }; //---------------------------------------------------------------------------- #endif
so das sind die funktionen... wenn dir das nix hilft, scick ich dir gerne die anderen quelltexte der dll(sind net viele)
-
1. Wir arbeiten hier mit C++, also schmeiss malloc weg.
2. Das Zeugs ist so scheisse kommentiert, da werf ich nicht mal n halbes auge drauf
3. Hast du deine Methoden schonmal debuggt um die exakte Zeile festzustellen wo der Fehler auftritt?-junix
-
wie gesagt, die funktionene funktionieren.... nur wenn ich sie in einer dll verwende, dann bekomm ich einen 'invalid pointer operation' error. und nur dann!
-
DreadlockFilbert schrieb:
wie gesagt, die funktionene funktionieren....
Offensichtlich nicht komplett??
DreadlockFilbert schrieb:
nur wenn ich sie in einer dll verwende, dann bekomm ich einen 'invalid pointer operation' error. und nur dann!
Die Frage war ja: Zu welchem Zeitpunkt? -> Ich mach meine Hinweise hier nicht zum Zeitvertreib und weils mir lustig ist hin. Wenn ich schreibe debuggen dann meine ich debuggen!
-junix
-
ich bekomme den fehler immer dann wenn ich die funktion aus der dll heraus aufrufe und einen AnsiString übergebe...
String __stdcall FBNetConMngr::receiveString() { return "auch das geht net!"; }
also hier wied ja wohl kein fehler sein, oder?
ich rufe die funktion dann so auf:
FBNetConMngr *newConMngr; String blabla=newConMngr->receiveString();
oder ist das auch falsch?
-
Hi,
nimm die Funktionen erst einmal aus der dll raus und pack die in dein Projekt. Dadurch kannst du besser debuggen. Stelle genau durch, und erzähle uns an welcher Stelle der Debugger sich davon macht.
-
Man sollte sich schon durchlesen, was der BCB so zu sagen hat:
BCB über jeder VCL-DLL schrieb:
//---------------------------------------------------------------------------
// Wichtiger Hinweis zur DLL-Speicherverwaltung, falls Ihre DLL die
// statische Version der Laufzeitbibliothek (RTL) verwendet:
//
// Wenn Ihre DLL Funktionen exportiert, die String-Objekte (oder Strukturen/Klassen,
// die Strings enthalten) als Parameter übernehmen oder als Funktionsergebnis
// zurückgeben, muß die Bibliothek MEMMGR.LIB in sowohl dem DLL-Projekt als auch in
// jedem Projekt, das diese DLL verwendet, eingebunden werden. MEMMGR.LIB wird auch
// dann benötigt, wenn andere Projekte, die die DLL verwenden, Erstellungs- bzw.
// Freigabeoperationen auf Klassen durchführen, die nicht von TObject abgeleitet sind.
// Die Verwendung von MEMMGR.LIB führt dazu, daß BORLNDMM.DLL sowohl von der DLL als
// auch von der aufrufenden EXE-Datei als Speicherverwaltung benutzt wird. In diesem
// Fall muß BORLNDMM.DLL mit der DLL weitergegeben werden.
//
// Falls Sie BORLNDMM.DLL nicht verwenden möchten, sollten Strings als "char *" oder
// ShortString übergeben und zurückgegeben werden.
//
// Falls die DLL die dynamische Version der RTL verwendet, muß
// MEMMGR.LIB nicht explizit eingebunden werden.
//---------------------------------------------------------------------------Wenn du in deiner DLL deswegen auf AnsiStrings verzichten möchtest, dann rate ich die "#include <vcl.h>" rauszulassen und stattdessen die C++ String-Klasse zu verwenden.
-
ich will weder auf die ansi stinrgs verziechten, noch hab ich irgend eine funktion die nicht geht
nur wenn sie in einer dll ist, macht sie fehler.... egal. ich werd dann wohl keine dll nemen
-
DreadlockFilbert schrieb:
nur wenn sie in einer dll ist, macht sie fehler....
Nein, du machst Fehler, da du dich nicht an die Instruktionen von Borland hältst. Wenn du unbedingt AnsiStrings in der DLL benutzen willst (mit STL-Strings kann man übrigens ebenso gut arbeiten), dann halte dich an das, was Borland dir vorgibt.