Gå til innhold

C++ Managed (mixed mode) feiler med 0xc0000005


Anbefalte innlegg

Og dette kjører på Windows 7 og ikke WInXP/Win2003 ?

 

Tror ikke det. Som jeg prøver å si - det er ikke koden det er noe feil med, men Windows sin håndtering av DLL lasting. Ditt kode eksempel krever kjøring for å feile - ikke sant? Og siden min kode ikke engang er i nærheten av å kjøre så er det altså således ingen feil med koden

 

For å si det som deg:

int* ptr = new int[100];
ptr[99] = 500
MessageBox.Show("Tittei!");
ptr[100] = 1000;

Hva tror du kommer først? Tittei eller Error 0xC0000006 ?

 

Setter en femmer på at Tittei kommer først. Og jeg hakke engang testkopilert koden din ;-)

 

Og det er nettop dette som er tilfelle hos meg. Meldingen kommer før noe som helst er kjørt.

Lenke til kommentar
Videoannonse
Annonse

Hva med initialisering av variabler da?

 

int * ptr = new int[100];
int a = ptr[100];

int main()
{
 std::cout << "Tittei!";
}

 

edit: jeg kunne satset penger på at problemet ikke ligger ved lasting av DLL-er i Windows. Dette er med høy sikkerhet en programmeringsfeil fra din side. At det fungerer forskjellig på forskjellige systemer kan være helt tilfeldig. Alt fra manglende konfigurasjonsfiler, til DLL versjonsfeil (dog jeg ville påstått at det siste er temmelig usannsynlig)

Endret av GeirGrusom
Lenke til kommentar

Jada, jeg skjønner det, men det forklarer ikke at det virker i Windows 7 og ikke i XP/WIn2003 gjør det vel? Hadde det vært noe slikt så ville jo ikek programmet virka i det hele tatt, ville det vel? Dessuten så er denne DLL'en strippet totalt for slikt. Den er kunn en wrapper som videre sender rett til C# DLL'ene. Jeg har jo for testen skyld strippet vekk alt som er av kode i C++ DLL'en slik at kunn de to API'ene mine er igjen. Dermed har jeg en C++ DLL som er helt 100% selvstendig og skal ikke dra med seg noen av de andre DLL'ene, med unntak av system DLL'er så klart, men det har jo ikke jeg kontroll over. Og eneste kode som er igjenn er to API som begge kunn nå inneholder return NULL;

 

Her er hele C++ koden min, så kan du jo se selv om du ser noen slike rariteter. Jeg finner i hvertfall ingen:

 

 

#include <atlstr.h>

#include <stdio.h>

#include <iostream>

#include <list>

#using <mscorlib.dll>

 

 

typedef unsigned char byte;

typedef unsigned short int ushort;

typedef unsigned int uint;

 

using namespace System;

using namespace System::Runtime::InteropServices;

 

#pragma region --< Enums >--

 

enum ExternalRelationsVendor

{

Comunisafe = 1,

Eniro = 2

};

 

#pragma endregion

 

#if _MSC_VER > 1499 // VIsual Studio 2008 +

//#include <msclr\marshal.h>

//using namespace msclr::interop;

#endif

 

#pragma region --< InterOP Interfaces >--

 

#pragma region --< iCommunisafe >--

class iCommunisafe

{

public:

virtual char * __stdcall AddCase(char * pCaseID) = 0;

virtual char * __stdcall AddDocument(char * pDocumentID) = 0;

virtual char * __stdcall AddDocument(char * pDocumentID, char * pContactID) = 0;

virtual char * __stdcall AddText(char * pTextID) = 0;

virtual char * __stdcall AddUser(char * pUserID) = 0;

virtual void __stdcall AssignCommunisafeUsers() = 0;

virtual char * __stdcall SynchronizeCase(char * pCaseID) = 0;

virtual char * __stdcall GetNewCases() = 0;

};

 

#pragma endregion

 

#pragma region --< Global Data >--

 

class iGlobalData_Version

{

public:

virtual int __stdcall Major() = 0;

virtual int __stdcall Minor() = 0;

virtual int __stdcall Build() = 0;

virtual int __stdcall Revisioned() = 0;

};

 

class iGlobalData_Paths

{

public:

virtual char * __stdcall DocumentPath() = 0;

virtual char * __stdcall ServerProgramPath() = 0;

virtual char * __stdcall SystemINI() = 0;

virtual char * __stdcall UserINI() = 0;

virtual char * __stdcall UserTmpDir() = 0;

virtual char * __stdcall UserAppDataDir() = 0;

virtual char * __stdcall UserTmpINI() = 0;

};

 

class iGlobalData_Demo

{

public:

virtual byte __stdcall Version() = 0;

virtual int __stdcall Date() = 0;

};

 

class iGlobalData_User

{

public:

virtual char * __stdcall Language() = 0;

virtual char * __stdcall GetUserID() = 0;

};

 

class iGlobalData_Other

{

public:

virtual byte __stdcall ReadOnly() = 0;

virtual CHAR * __stdcall GetConnectionString() = 0;

};

 

#pragma endregion

 

#pragma region --< Functions >--

 

class iGlobalFunctions

{

public:

virtual char * __stdcall New_KUNNr(int pRec_KunAnsvar) = 0;

virtual void __stdcall HandleException(char * pExceptionData) = 0;

};

 

#pragma endregion

 

#pragma region --< Clarion Interface >--

 

class iClarion

{

public:

virtual iGlobalData_Version * __stdcall GetIGlobalData_Version() = 0;

virtual iGlobalData_Paths * __stdcall GetIGlobalData_Paths() = 0;

virtual iGlobalData_Demo * __stdcall GetIGlobalData_Demo() = 0;

virtual iGlobalData_User * __stdcall GetIGlobalData_User() = 0;

virtual iGlobalData_Other * __stdcall GetIGlobalData_Other() = 0;

virtual iGlobalFunctions * __stdcall GetIGlobalFunctions() = 0;

};

 

#pragma endregion

 

#pragma endregion

 

#pragma managed

 

#pragma region --< Add Implementations here >--

 

#pragma region --< Add Namespaces here >--

 

// using namespace Advisor::PresentationLayer::Communisafe;

 

#pragma endregion

 

#pragma region --< Communisafe >--

 

class CommunisafeClass : public iCommunisafe

{

public:

//Constructor

CommunisafeClass(iClarion * pClarionCallback)

{

// try

// {

ThisClarionCallback = pClarionCallback;

ThisUser = ThisClarionCallback->GetIGlobalData_User();

ThisOtherGlobalData = ThisClarionCallback->GetIGlobalData_Other();

ThisClarionGlobalFunctions = ThisClarionCallback->GetIGlobalFunctions();

ThisClarionGlobalPaths = ThisClarionCallback->GetIGlobalData_Paths();

// CommunisafeInterOP::ShowLogo();

// CommunisafeInterOP::SetConnection(ToNetString(ThisOtherGlobalData->GetConnectionString()));

// CommunisafeInterOP::Login(ToNetString(ThisUser->GetUserID()));

// CommunisafeInterOP::SetDocumentPath(ToNetString(ThisClarionGlobalPaths->DocumentPath()));

// if (CommunisafeManager::Login(EmployeeFilemanager::Fetch(ToNetString(ThisUser->GetUserID()))) == false)

// MessageBox(NULL, L"Login Failed", NULL, NULL);

// CommunisafeManager::Login(EmployeeFilemanager::Fetch(ToNetString(ThisUser->GetUserID())));

// }

// catch

// {

// MessageBox(NULL, L"Unable to initiate Clarion - C# connection. Program wil terminate!", NULL, NULL);

// }

// CommunisafeInterOP::HideLogo();

}

 

// Destructor

~CommunisafeClass()

{

// CommunisafeInterOP::Logout();

}

 

virtual char * __stdcall AddCase(char * pCaseID)

{

// return ToCString(CommunisafeInterOP::AddCase(ToNetString(pCaseID)));

return NULL;

}

 

virtual char * __stdcall AddDocument(char * pDocumentID)

{

// return ToCString(CommunisafeInterOP::AddDocument(ToNetString(pDocumentID)));

return NULL;

}

 

virtual char * __stdcall AddDocument(char * pDocumentID, char * pContactID)

{

// return ToCString(CommunisafeInterOP::AddDocument(ToNetString(pDocumentID), ToNetString(pContactID)));

return NULL;

}

 

virtual char * __stdcall AddText(char * pTextID)

{

// return ToCString(CommunisafeInterOP::AddText(ToNetString(pTextID)));

return NULL;

}

 

virtual char * __stdcall AddUser(char * pUserID)

{

// return ToCString(CommunisafeInterOP::AddUser(ToNetString(pUserID)));

return NULL;

}

 

virtual void __stdcall AssignCommunisafeUsers()

{

// CommunisafeInterOP::AssignCommunisafeUsers();

}

 

virtual char * __stdcall SynchronizeCase(char * pCaseID)

{

// return ToCString(CommunisafeInterOP::SynchronizeCase(ToNetString(pCaseID)));

// if (CommunisafeInterOP::SynchronizeCase(ToNetString(pCaseID)) == true)

// return 1;

// return 0;

}

 

virtual char * __stdcall GetNewCases()

{

// return ToCString(CommunisafeInterOP::SynchronizeCases());

return NULL;

}

 

private:

iGlobalData_User * ThisUser;

iGlobalData_Other * ThisOtherGlobalData;

iClarion * ThisClarionCallback;

iGlobalFunctions * ThisClarionGlobalFunctions;

iGlobalData_Paths * ThisClarionGlobalPaths;

 

bool ToNetBool(byte pValue)

{

if (pValue == 0)

return false;

return true;

}

 

byte BoolToByte(bool pValue)

{

if (pValue == true)

return 1;

return 0;

}

 

System::String ^ ToNetString(char * pString)

{

return gcnew String(pString);

}

 

char * ToCString(String ^pNetString)

{

char * cString = (char *)Marshal::StringToHGlobalAnsi(pNetString).ToPointer();

return cString;

}

 

};

 

 

#pragma endregion

 

#pragma endregion

 

#pragma unmanaged

 

#pragma region --< Add External API here >--

 

#pragma region --< Communisafe >--

 

extern "C" __declspec(dllexport) iCommunisafe * __stdcall SetCommunisafeInterOP(iClarion * pClarionCallback)

{

MessageBox(NULL, L"Inn i C++", NULL, NULL);

// CommunisafeClass * ThisInterOP = new CommunisafeClass(pClarionCallback);

// return ThisInterOP;

return NULL;

}

 

extern "C" __declspec(dllexport) void __stdcall RemoveCommunisafeInterOP(iCommunisafe * pInterface)

{

MessageBox(NULL, L"Ut av C++", NULL, NULL);

// delete((CommunisafeClass *) pInterface);

return;

}

 

#pragma endregion

 

#pragma endregion

 

 

 

Og legg merke til at det som fyrer igang det hele er API'ene mine. Og som jeg har nevnt sikkert en dullion ganger, koden i Clarion programmet er ikek startet slik at disse to API er IKKE kallet noen plass

 

glemte å nevne. I ovennevnte kode er alt som har med .NET å gjøre kommentert slik at jeg kunne teste i fred og ro med en simpel DLL

Lenke til kommentar

Nei. Det gjør jeg ikke, fordi vi opplevde problemer med VC100 runtimet og kode bygget med Dwebug på. Virker som at man da må ha et annet runtime, men dette aner jeg null og niks om . Har null kompetanse på VC++

 

Anyway, legger ned tråden for jeg føler jeg ikek kommer noen vei...

Lenke til kommentar

Har i hvertfall hatt problemer med 0xc0000005 før. Dette var da native kode som feila hardt i release mode, men måtte skru av et alternativ under Linker settings som omhandlet funksjonsreferanser. Husker ikke hva det het i farta. Sikker på at du har __declspec(dllexport) eller noe sånt?

Endret av TheMaister
Lenke til kommentar

Har i hvertfall hatt problemer med 0xc0000005 før. Dette var da native kode som feila hardt i release mode, men måtte skru av et alternativ under Linker settings som omhandlet funksjonsreferanser. Husker ikke hva det het i farta. Sikker på at du har __declspec(dllexport) eller noe sånt?

Nå er vi inne på noe...

Men hvorfor fungerer dette på Win7 maskinene våre? Hvorfor skal det være forskjell når vi prøver å kjøre dette på WIn2003? Jeg fjernet C++ laget og kjører nå en .NET EXE produsert i C#. Starter dette programmet med parametere for å komme frem til rett sted. Kjip og elendig løsning, spesiellt fordi det ikke er enhetlig og at det ikek lar seg gjøre å sende parametere på en ordentlig måte, men det funker. Poenget mitt er at dette også funker på Windows 2003 uten noe som helst problemer.

 

Når det gjelder __declspec og slikt så kan du jo eventuellt ta en titt i min kode som jeg postet litt lenger opp i tråden. Hvis du har noen innspill der så er jeg mer en mottagelig :-D

 

Mine to API som eksporteres finner du i bunn av dokumentet

Lenke til kommentar

Istedet for å skru av debugging burde du løse problemet rett der. Kan være der problemet ligger. Du løser ikke et problem ved å grave det ned.

Hvis du har et Hjul med 4 hull i felgen så kan du ikke bruke det på en bil som har 5 bolter. Det er fortsatt ikek noe galt med Hjulet, er det vel?

 

Jeg prøver å si at det ikke er noe galt med koden min, men lastingen av DLL'en

Endret av HDSoftware
Lenke til kommentar

Har i hvertfall hatt problemer med 0xc0000005 før. Dette var da native kode som feila hardt i release mode, men måtte skru av et alternativ under Linker settings som omhandlet funksjonsreferanser. Husker ikke hva det het i farta. Sikker på at du har __declspec(dllexport) eller noe sånt?

Nå er vi inne på noe...

Men hvorfor fungerer dette på Win7 maskinene våre? Hvorfor skal det være forskjell når vi prøver å kjøre dette på WIn2003? Jeg fjernet C++ laget og kjører nå en .NET EXE produsert i C#. Starter dette programmet med parametere for å komme frem til rett sted. Kjip og elendig løsning, spesiellt fordi det ikke er enhetlig og at det ikek lar seg gjøre å sende parametere på en ordentlig måte, men det funker. Poenget mitt er at dette også funker på Windows 2003 uten noe som helst problemer.

 

Når det gjelder __declspec og slikt så kan du jo eventuellt ta en titt i min kode som jeg postet litt lenger opp i tråden. Hvis du har noen innspill der så er jeg mer en mottagelig :-D

 

Mine to API som eksporteres finner du i bunn av dokumentet

 

Kan være undefined behavior. Har også vært borti at man må kalle på CoInitialize().

 

Fungerer det hvis du kompilerer programmet ditt med debug mode enablet?

Endret av TheMaister
Lenke til kommentar

Jeg prøver å si at det ikke er noe galt med koden min, men lastingen av DLL'en

Hvordan skal det gå feil? I så fall så har du feil header eller lib filer for DLL-en du linker til, eventuelt bruker du feil calltype (ser du bruker stdcall, pass på at dette er riktig i begge ender, og at du er konsekvent med det)

Uansett så ender det opp i at det er en programmeringsfeil fra din side. Få programmet bygget med debugging, så finner du sikkert ut av det på minutter.

Lenke til kommentar

Hvordan det skal gå feil? Det er da ikke vanskelig å tenke seg. Lastingen av en DLL er en komplisert affære. Det er jo ikek slik at en DLL lastes inn i minnet og automatisk er klar til bruk. Det kjøres en hel drøss med program fra OS'et sin side som klargjør minne, oppretter call tabeller +++++

Det er også slik at en DLL som lastes har en, kall det boot-code. Dette er jo kode som en selv ikke har kontroll på med mindre man "tvinger" seg på dette laget. I tillegg så sjekker OS'et alle sammenhenger og avhengigheter med andre DLL'er og resurs filer. Bare å kjøre en profile med dep.walker det så ser du hva som skjer. Tar du f.eks. den koden jeg postet og limer den inn i et C++ prosjekt og kompillerer dette så vil du mest sansynlig klare å kjøre profiler på den i Windows 7. Men prøver du det samme på Windows 2003 så vil det feile, og det er nettop dette problemet jeg har. Og dette har null og niks med min kode å gjøre. Min påstand er at noe mangler eller er ukompatibelt når det er kompillert på en Windows 7 maskin. Jeg hadde tenkt å prøve å installere VS2010 på terminal serveren og se om det hjalp med en rekompillering der, men fikk aldri tid for vi måtte levere...

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...