Pointer als Paramerter übergeben



  • Schuss ins Blaue: Du übergibst einen nicht oder zu kurz initialisierten Array als SafeAt-Parameter?

    Sorry, ohne zumindest den Aufruf-Code ist da sonst nicht viel zu raten.



  • das kann verschiedene gründe haben, aufrufer bietet zu wenig speicher an oder sowas. vielleicht kopierste mal die funktion in ein separates testprojekt und steppst mit'm debugger durch?



  • in der aufrufenden dll_a habe ich folgende variablen bzw pointer definiert, die ich dann der funktion übergebe:

    in einer header:

    .
    .
    typedef int (*GET_UUT) (char *Label, char *SafeAt, int length, BOOL UseOld);
    .
    .
    

    im konstruktor:

    .
    .
    this->m_Lookup_Dll_poi = LoadLibrary("Lookup.dll");
       if (m_Lookup_Dll_poi != NULL)
       {
    	   m_GetData_poi = (GET_UUT)GetProcAddress(m_Lookup_Dll_poi, "getData");								//Adress für Funktionaufruf ermitteln
       }
       else
       {
    	   m_GetData_poi = NULL;
       }
    .
    .
    

    aufruf der funktion getData:

    .
    .
    char *pPath = 0;
    int id = 0;
    
    id = m_GetData_poi(pLabel, pPath, 128, false);
    .
    .
    


  • Dann vergleich mal die Parameterliste der Funktion mit dem Pointer, dem du sie zuweist (Tip:achte mal auf den Typ des zweiten Parameters).



  • Mal ganz davon abgesehen ist pPath == 0, und da das kein Doppelzeiger (oder Referenz-auf-Zeiger) ist, kann dir getData dort nichts "reinschreiben" - da ist nämlich nichts zum reinschreiben.

    (EDIT: Womit mein allererster Tipp sich bestätigen würde :D)



  • @CStoll: ups, hab vorhin bissel getestet, sollte eigentlich schon

    int getData (char *Label, char *SafeAt, int length, BOOL UseOld)
    

    heißen ;P

    sorry, ich blick gerade nicht mehr durch....steh voll aufm schlauch.
    was muss ich machen? 😕



  • Entschuldigung, Du musst wissen was die DLL von Dir erwartet, nicht wir.

    Jetzt mal basierend auf der Vermutung, die Funktion erwarte von Dir ein char-Array mit der Länge length, müsstest Du sowas tun:

    int length = 128;
    char *pPath = new char[length];
    m_GetUUT_poi(pLabel, pPath, length, false);
    

    Aber das hier ist alles Glaskugel!!



  • hab jetzt schon ein paar sachen durch probiert, selbst mit CString funktioniert es nicht...

    ich poste gleich mal die aufrufende und die aufzurufende funktion, dann könnt ihr euch vielleicht ein bild machen.



  • Testest du eigentlich auch ob m_GetData_poi evtl 0 ist? Weil GetProcAdress könnte dir auch 0 zurückgeben wenn es das Symbol nicht findet. => Accessviolation 😉

    BR



  • hier der aufruf in dll_a:

    void Data::StartWork(char *Label)
    {
        CString TmpLine, DataString, BatchString;
    	char *CharHelp;
    
    	BOOL Fehler = FALSE;
    	int i;
    
    	LabelOutString = Label;
    	LabelOutString.Remove('\n');
    	LabelOutString.Remove('\r');
    
    	for (i = 0; i < LabelOutString.GetLength(); i++)
    		Label[i] = LabelOutString.GetAt(i);
    	Label[i] = '\0';
    
    	//Wenn das Label nicht gesetzt ist, muss nicht weiter gearbeitet werden
    	if (Label[0] == '\0')
    	{
    		WriteLogFile("Empty Label - Batch neither Selected or executed");
    		mScanField->setCaption("");
    		return;
    	}
    
    	CString MB_OP;
    	if ((NULL == m_GetData_poi) )
    	{
    		AfxMessageBox("TEST 2", MB_OK | MB_ICONERROR);
    		mScanField->setCaption("");
    		return;
    	}
    
    	CString Controller;
    	GetconInfoPChar(cipControllerName, (tCiPId)0, Controller.GetBuffer(128), 128);
    
    	if (-1 != Controller.Find("virtual controller", 0))
    	{
    		MB_OP.Format("warung, virtueller controller");
    		Fehler = TRUE;
    	}
    
    	if (Fehler)
    	{
    		MB_OP = "m_Language.Warning1" + MB_OP + "m_Language.Warning2";
    		WriteLogFile(MB_OP);
    		if (IDYES != MessageBox(NULL, MB_OP, "m_Language.OwnName", MB_YESNO | MB_ICONWARNING))
    		{
    			WriteLogFile("User selected \"NO\"");
    			mScanField->setCaption("");
    			return;
    		}
    		WriteLogFile("User selected \"Yes\"");
    	}
    
    	CharHelp = DDERequest("STATE", 1024, TmpLine.GetBuffer(1024));
    	TmpLine = TmpLine.GetBuffer(1024);
    
    	if (NULL == CharHelp)
    	{
    		mScanField->setCaption("");
    		return;
    	}
    
    	if (-1 == TmpLine.Find("DIR", 0))
    		DataString = "";
    	else
    	{
    		TmpLine = TmpLine.Right(TmpLine.GetLength() - TmpLine.Find("DIR", 0) - 3);
    		DataString = TmpLine.Left(TmpLine.Find("\n", 0));
    		DataString.Remove('\r');
    		DataString.TrimLeft();
    		DataString.TrimRight();
    		DataString = DataString.Left(DataString.ReverseFind('\\'));
    	}
    
    	if (-1 == TmpLine.Find("BATCH", 0))
    		BatchString = "";
    	else
    	{
    		TmpLine = TmpLine.Right(TmpLine.GetLength() - TmpLine.Find("BATCH", 0) - 4);
    		BatchString = TmpLine.Left(TmpLine.Find("\n", 0));
    		BatchString = BatchString.Right(BatchString.GetLength() - 1 - BatchString.ReverseFind('\\'));
    		BatchString.Remove('\r');
    		BatchString.TrimLeft();
    		BatchString.TrimRight();
    	}
    
    //*****************HIER DER AUFRUF******************************
    
    	int id = 0;
    	int length = 256;
    	char *pPath = new char[length]; 
    
    	a = m_GetData_poi(Label, pPath, length, false);
    
    	.
    	.
    	.
    }
    


  • und hier die aufzurufende funktion in der dll_b:

    extern "C" __declspec(dllexport) int getData (char *Label, char *SafeAt, int length, BOOL UseOld)
    {
    	if ((Label == NULL) || ((CString)Label == ""))
    		return -10;
    
    	FILE *LookupFile;
    	int rueck;
    	LookupFile = OpenLookupFile(rueck, UseOld);
    
    	if ((rueck != 0) || (LookupFile == NULL))
    		return rueck;
    
    	CString CompareLabel;
    
    	CompareLabel = Label;
    	if (-1 != CompareLabel.Find("#S", 0))
    		CompareLabel = CompareLabel.Left(CompareLabel.Find("#S", 0));
    
    	CString Line;
    	char Buffer[1024], *FgetsRueck;
    
    	while (NULL != (FgetsRueck = fgets(Buffer, 1023, LookupFile)) )
    	{
    		Line = Buffer;
    
    		if (-1 != Line.Find("--", 0))
    			Line = Line.Left(Line.Find("--", 0));
    
    		if (-1 == Line.Find("$", 0))
    			continue;
    
    		if (Line.Find(CompareLabel, 0) != -1)
    			break;
    	}
    
    	fclose(LookupFile);
    	if (FgetsRueck == NULL)
    		return -10;
    
    	CString DataString;
    	int pos;
    
    	pos = Line.Find("$", 0);
    	DataString = Line.Mid(pos + 1, Line.ReverseFind('$') - 1);
    	DataString.TrimLeft();
    	DataString.TrimRight();
    	if (length < DataString.GetLength())
    		return -1;
    
    	sprintf(SafeAt, "%s", DataString);
    	return 0;
    }
    

    vielleicht hilft das weiter.

    hab den code gekürzt, nicht wundern wenn ein paar sachen unschlüssig sind 😉



  • Aha. Hast du den typedef für UUT auch extern "C"?



  • nein, den hab ich so in der header stehen wie vorn beschrieben:

    typedef int (*GET_UUT) (char *Label, char *SafeAt, int length, BOOL UseOld);
    

    muss ich da extern "C" benutzen?


Anmelden zum Antworten