Skip to main content
GameDev.net gamedev.net
🔒 Locked

Problems with dll import

Started by emileej Jan 2, 2004 at 8:54 AM 5 replies 400+ views
Original Post
emileej
emileej
When I try importing the functions from my dll using GetProcAddress I get an assertion error from dbgheap.c in "_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)" My program is compiled as release and my dll as debug so being a newbie wid the VC++ compiler I am guessing its the dll thats messin up things. When I compile my dll I get the same warning on three functions and I am thinking they are causing the problem. Here is one of the three warnings:
C:\Programmering\cpp\Gens\ClientPlug\ClientPlug.cpp(27) : warning C4786: ''std::reverse_iterator,std::allocator > const *,std::basic_string,std::allocator >,std::ba
sic_string,std::allocator > const &,std::basic_string,std::allocator > const *,int>'' : identifier was truncated to ''255'' characters in the debug information 
"Stop trying to hit me and hit me!"
Emil Johansen- SMMOG AI designerhttp://smmog.com
emileej
emileej
Noone in here been mesing with DLL imports?!
Emil Johansen- SMMOG AI designerhttp://smmog.com
emileej
emileej
I have narrowed the problem down to when the init function returns. I have debug output as far as to right before my "return true;" but right after the function call I have no debug output - my app crashes when the function returns. What on earth is this for a deamon? I have never seen anything like it before.
Emil Johansen- SMMOG AI designerhttp://smmog.com
Basiror
Basiror
you are using a name with more than 255 characters in your program or probably the parameters of a function sum up to more then 255 characters

that s causing your problem

search the MSDN für the entry C4786
this here is from MSDN(german) maybe you know a little bit german, since you are from denmark

Compiler-Warnung (Stufe 1) C4786
''Bezeichner'' : Bezeichner wurde auf ''Nummer'' Zeichen in den Fehlerinformationen verkürzt

Die Bezeichner-Zeichenfolge überschritt die maximal erlaubte Länge und wurde verkürzt.

Der Debugger kann keine Fehler in Code beheben, der Symbole enthält, die länger als 255 Zeichen sind. Im Debugger können Sie die verkürzten Symbole nicht anzeigen, auswerten, aktualisieren oder überwachen.

Durch die Verkürzung von Bezeichnernamen können Sie diese Beschränkung umgehen. Der untenstehende Beispiel-Code demonstriert diese Methode.

Es kann auch ein Aufzeichnungsmechanismus zur Lösung dieses Problems verwendet werden. Ein Aufzeichnungsmechanismus funktioniert wie die printf-Anweisungen im Code. Er überwacht die Anwendung während der Fehlersuche. Die Makros _ASSERT, _ASSERTE, _RPTn und _RPTFn stellen kompakte und flexible Möglichkeiten dar, um den Ablauf zu steuern. Diese Makros sind nicht definiert, wenn _DEBUG nicht definiert ist. Weitere Informationen finden Sie unter Verwenden von Makros für Überprüfungen und Berichte.

Das folgende Beispiel demonstriert eine Situation, die diese Compiler-Warnung erzeugen würde, und die Lösung für dieses Problem:

//sample1.cpp

//In diesem Programm befindet sich eine Klasse mit einem

//sehr langem Namen. Es wird ein Objekt dieses Klassen-

//typs instantiiert. Es werden mehrere C4786-Warnungen

//angezeigt. Die folgenden Kommentare zeigen die Lösung

//für dieses Problem.


#define ein_sehr_langer_Klassenname ein_sehr_sehr_sehr_sehr_sehr_sehr_sehr_sehr_sehr_sehr_sehr_sehr_sehr_sehr_sehr_sehr_sehr_sehr_sehr_sehr_sehr_sehr_sehr_sehr_sehr_sehr_sehr_sehr_sehr_sehr_sehr_sehr_sehr_sehr//_sehr_langer_Klassenname


//LÖSUNG: Löschen Sie die Kommentierung der folgenden

//Zeilen


//#ifdef _DEBUG

//#define ein_sehr_langer_Klassenname EIN_KURZER_KLASSENNAME

//#endif


class ein_sehr_langer_Klassenname
{
public:
ein_sehr_langer_Klassenname() {};
int m_data;
};

void main()
{
ein_sehr_langer_Klassenname test_obj;
test_obj.m_data = 12;
}

Das folgende Beispiel demonstriert, daß Vorlagen mit langen Klassennamen als Parameter sehr schnell die Zeichenbegrenzung von 255 Zeichen überschreiten können. Es werden auch Lösungen für dieses Problem dargestellt.

//sample2.cpp

//LÖSUNG1: Löschen Sie die Kommentierung der nächsten 4

//Zeilen

//#ifdef _DEBUG

//#define SehrLangerKlassennameA A

//#define SehrLangerKlassennameB B

//#endif


//LÖSUNG2: Eine alternative Lösung:

//Löschen Sie die Kommentierung der nächsten 3

//Zeilen.

//#ifdef _DEBUG

//#define EineWillkuerlicheKlasse SRC

//#endif


template <class A1, class A2, class A3, class A4>
class SehrLangerKlassennameA{};

template <class B1, class B2, class B3>
class SehrLangerKlassennameB{};

template <class C1, class C2>
class SehrLangerKlassennameC{};

template <class D1>
class SehrLangerKlassennameD{};

class EineWillkuerlicheKlasse{};

typedef SehrLangerKlassennameD<EineWillkuerlicheKlasse> KlasseD ;
typedef SehrLangerKlassennameC<EineWillkuerlicheKlasse, KlasseD> KlasseC;
typedef SehrLangerKlassennameB<EineWillkuerlicheKlasse, KlasseC, KlasseD> KlasseB;
typedef SehrLangerKlassennameA<EineWillkuerlicheKlasse, KlasseB, KlasseC, KlasseD> KlasseA;

void EineWillkuerlicheKlasse(KlasseA aobj){}

void main()
{
KlasseA AObj ;
EineWillkuerlicheKlasse(AObj) ;
}

http://www.8ung.at/basiror/theironcross.html
emileej
emileej
Yes I can read it perfectly fine. I have now shortened the names of the functions in question and also the size of their argument list but I now get the same error on four parts of std::vector. I am clueless...
Emil Johansen- SMMOG AI designerhttp://smmog.com
emileej
emileej
There is no way around this? std must go?
Emil Johansen- SMMOG AI designerhttp://smmog.com
emileej
emileej
Temporary solution: I got rid of vector. This works but isnt very pretty. Thats just the way of dlls?
Emil Johansen- SMMOG AI designerhttp://smmog.com

Topic Locked

This topic has been locked by a moderator. New replies are not allowed.

Sign in to reply to this topic.