Funktion aus einer DLL lesen

Thopeto

Erfahrenes Mitglied
Hallo

Ich möchte aus einer DLL eine Funktion starten. In meiner DLL sieht es so aus:
Code:
  // plugin.h
  #define DLL_API __declspec(dllexport)
  	
  typedef struct
  {
  	CString strName;
  	CString strDescription;
  	CString strCopyright;
  	CString strWebsite;
  
  	CString	strText;
  	int		iLetters;
  	int		iLines;
  } PLX_Module;
  
  extern "C" DLL_ void apiMain(PLX_Module *Module);
Code:
  // plugin.cpp
  THOPETO_API void apiMain(PLX_Module *Module)
  {
  	AFX_MANAGE_STATE(AfxGetStaticModuleState());
  	PLX_Module Modul;
  	Modul.strName = _T("sfsdf");
  	Modul.strDescription = _T("sdfsdfsdf");
  	Modul.strCopyright = _T("sdfdsfdsf");
  	Modul.strWebsite = _T("sdfdsfdsfdsfsf");
  	Modul.strText = _T("Das ist der source");
  	
  	*Module = Modul;
  }
Laden Tu ich die DLL so
Code:
  // In meiner anwendung
  typedef struct
  {
  	CString strName;
  	CString strDescription;
  	CString strCopyright;
  	CString strWebsite;
  
  	CString	strText;
  	int		iLetters;
  	int		iLines;
  } PLX_Module;
  
   typedef void (*PFUNC)(PLX_Module*);
   
  BOOL CDlgModule::OnInitModule()
  {
  	SetCurrentDirectory(GetAppPath() + "/Module/");
  	CFileFind finder;
  	CString strWildCard = _T("*.dll");
  
  	BOOL bWorking = finder.FindFile(strWildCard);
  	while (bWorking)
  	{
  		bWorking = finder.FindNextFile();
  		if (finder.IsDots() || finder.IsDirectory())
  			continue;
  
  		HMODULE hm = LoadLibrary(finder.GetFilePath());
  
  		if(!hm)
  		{
 		 AfxMessageBox("Fehler: Kann folgendes Modul nicht korrekt laden: " + finder.GetFilePath());
  		
  		}
  		else
  		{
  			m_dwa.Add((DWORD)hm);
 		 PFUNC pFunc = (PFUNC)GetProcAddress((HINSTANCE)m_dwa.GetAt(finder.FindNextFile()), _T("apiMain"));
  			if(pFunc != NULL)
  			{
  				PLX_Module Modul;
 		 		pFunc(&Modul); // hier kommt dann ein fehler
  			}
  		}
  
  	}
  
  	return TRUE;
 }
sobald ich dann die anwendung starte, und die funktion, welche in der dll ist, starte, kommen 2 fehlermeldungen und die anwendung stürzt ab:

1. Fehler:
File: dbgheap.c
Line: 1011
Experssion: _CrtIsValidHeapPointer(pUserData)

2. Fehler:
File: dbgheap.c
Line: 1017
Experssion: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
 
Ich habs nicht ausprobiert, aber ich denke die Definition von PLX_Module Modul; solltet du früher machen als kurz bevor du die Funktion aufrufst. Mach die doch mal Global, vielleicht klappts dann.
Code:
PLX_Module Modul; // Global

// und der Aufruf dann so:
  if(pFunc != NULL)
  {
   PLX_Module Modul;
   pFunc(&Modul); // hier kommt dann ein fehler
  }
 
Nur mal so als Idee:
Hast du die DLL mal verändert, aber nicht die neueste Version in den Suchpfad kopiert?


Mfg

langer
 
Du solltest drauf achten dass du keine Debug Version des Programms mit einer Release Version der DLL benutzt (auch umgekehrt) weil dann in den MFC Dlls ganz böse sachen passieren .. und da du CString verwendest, kann es sein dass er das Objekt erst im Programm erstellt und in der DLL auf dem heap speicher freigibt bzw. reserviert und des knallt dann. Hab ich schon mal gehabt.
Angeblich kann man das auch teils verbessern wenn man in den Projekt einstellungen auf Multithreaded DLLs stellt
 
basd hat gesagt.:
Du solltest drauf achten dass du keine Debug Version des Programms mit einer Release Version der DLL benutzt (auch umgekehrt) weil dann in den MFC Dlls ganz böse sachen passieren .. und da du CString verwendest, kann es sein dass er das Objekt erst im Programm erstellt und in der DLL auf dem heap speicher freigibt bzw. reserviert und des knallt dann. Hab ich schon mal gehabt.
Angeblich kann man das auch teils verbessern wenn man in den Projekt einstellungen auf Multithreaded DLLs stellt


AAAAAAAAAHHHH das wars Die DLL war im Debug und meine Anwendung im Release modus...

danke danke danke danke *freu freu freu*
 
Zurück