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?


Anmelden zum Antworten