c++ dll einen const char * von CLI projekt übergeben
-
Hallo folgendes Problem ich habe eine dll (in c++ geschriben) dieser will ich einen Parameter von einem CLI projekt übergebn doch leider ist dieser immer leer wieso?
die dll stellt folgende fkt zur verfügung:
extern "C" { __declspec(dllexport) int Init(const char *filename); }
Wennich die fkt mit einem c++ projekt öffne funktioniert das mit cli nicht.
Im cli mache ich folgendes:
Init = (Initfkt) GetProcAddress (hinstLib, "InitConf"); xlStatus = Init(c_filename);
c_filename wird aber immer leer an die dll übergeben bzw. kommt dort so an.
Danke für eure hilfe
-
Tja, Du super Hirni, was ist den c_filename so?
-
const char *c_filename = filename.c_str();
und filename ist ein x beliebiger string
-
Müsste gehen, der Fehler muss also da liegen, wo hier kein Code dazu ist.
-
also hier mal im detail
Ich vermute zur Zeit das es daran liegt das ich eine unmanaged dl in einem managed projekt benutzen will.Global im cli Projekt
using namespace System::Drawing; using namespace std; typedef int (*Initfkt) (const char *filename);
Hier die fkt wo ich die dll verwenden will
private: System::Void butStart_Click(System::Object^ sender, System::EventArgs^ e) { HANDLE hFind; WIN32_FIND_DATA FindData; HINSTANCE hinstLib; hFind = FindFirstFile(L"..\\..\\*", &FindData); FindNextFile(hFind, &FindData); while (FindNextFile(hFind, &FindData)!= NULL) { LPSTR lpszName; char rgchTableName[257]; lpszName = rgchTableName; int nSize; nSize = ::WideCharToMultiByte(CP_ACP,0,FindData.cFileName, -1, lpszName, 257, NULL, NULL); std::string filename = rgchTableName; int pos = filename.find_first_of("."); if (pos != -1) { string extention = filename.substr(pos,filename.length()); if (extention == ".dll") { string prefix = filename.substr(0,1); string file = "..\\..\\" + filename; int len; int slength = (int)file.length() + 1; len = MultiByteToWideChar(CP_ACP, 0, file.c_str(), slength, 0, 0); wchar_t* buf = new wchar_t[len]; MultiByteToWideChar(CP_ACP, 0, file.c_str(), slength, buf, len); std::wstring newFilename(buf); #ifdef UNICODE std::wstring stemp = newFilename; // Temporary buffer is required LPCWSTR result = stemp.c_str(); #endif // Load Library HINSTANCE hinstLib; hinstLib = LoadLibrary(result); if (hinstLib == NULL) { textBox1->Text = "Load Failed"; } //Init module Initfkt Init; Init = (Initfkt) GetProcAddress (hinstLib, "InitConf"); int xlStatus=1; if ( Init != NULL ) { const char *c_filename = filename.c_str(); xlStatus = Init(c_filename); if (xlStatus ==0) textBox1->Text= "Init ok"; } } } } };
Filename hat eine übergebenen Inhalt!
-
FindClose(..) vergessen, mehrere delete[] vergessen, ungeprüfete Return Werte, unnötiger Code... einfach ein Graus.
Zu deinem Problem:
Ich halte fest, das Problem ist, dass in Init(..) im Funktionsargument ein Leerstring (= "") ankommt, obwohl aussen c_filename kein Leerstring ist.Ist c_filename wirklich kein Leerstring? Bau mal Traces ein.
Edit:
Filename hat eine übergebenen Inhalt!
Ich sehe keine Variable mit dem Namen.
Edit2:
FreeLibrary(..) auch vergessen.
-
Hab nochmal geschaut der String ist wirkolich nciht leer aber der fehler tritt auch auf wenn ich ihm dirket eine Zeichenkette gebe also
z.b.xlStatus = Init("test.dll")
-
Stimmt die Calling Convention?
-
ach sc.....
Ja danke.
-
Gelöst?