DLL -Funktionsaufruf mit Paramterübergabe



  • Guten Tag liebes Forum,

    folgendes Problem:

    Ich habe eine DLL vorliegen. Leider fehlt mir jegliche Beschreibung dazu. Einzig ein Code-Sample, mit dem aus VB heraus darauf zugegriffen wird lieg mir vor. Das Sample funktioniert auch soweit in VB. Nun benötige ich das Gleiche jedoch in C++. Leider bereitet mr das Probleme.

    CString GetBeispielfunktionFunktion()
    {
    	HMODULE handle;
    	handle = LoadLibrary("beispiel.dll");
    	if (handle==NULL)
    		return "Fehler";
    
    	wchar_t *in ;
    	wchar_t *out;
    
    	out= new wchar_t[40];
    	in= new wchar_t[6];
    	in[0]='9';
    	in[1]='2';
    	in[2]='7';
    	in[3]='6';
    	in[4]='3';
    	in[5]='\0';
    	int b=6;
    
            if (handle != NULL)
    		{
    		typedef void (*DLLFUNC)(wchar_t*,wchar_t*,int);
    		DLLFUNC func = (DLLFUNC)GetProcAddress(*handle, "GetText");
    
    		if (func)
    			func(out,in,b);
    		}
    return (LPCWSTR) out;
    }
    

    **
    Das Code-Sample für den Zugriff in VB:**

    Public Class Form1
    
        Declare Sub GetText Lib "beispiel.dll" ( _
            ByVal OutputString As String, _
            ByVal InputString As String, _
            ByVal InputLength As Byte)
    
     Dim outbuff As Char(40)
    
        Public Function GetText(ByVal InputString As String) As String
    
            GetText (outbuff, InputString, Len(InputString))
            MsgBox outbuff
        End Function
    End Class
    

    Dem Beispiel in VB nach gehe ich mal davon aus, dass ein char [40] als output übergeben, ein char * als Eingabe und ein int als Längenangabe für den Input reichen sollten.

    Soweit ich die Aufstellung hier http://msdn.microsoft.com/de-de/library/4xwz0t37.aspx verstanden habe, verwende ich die richtigen Datentypen.

    Meine Fehlermeldung:

    Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.

    Hat jemand eine Idee, wo das Problem liegen könnte?

    gruß
    klaus



  • als erstes würde ich mal

    typedef void (*DLLFUNC)(wchar_t*,wchar_t*,int);
    

    auserhalb einer funktion & der classe deklarieren.

    zweitens,
    was soll *handle bringen

    DLLFUNC func = (DLLFUNC)GetProcAddress(*handle, "GetText");
    

    versuch das mal ohne pointer...



  • Da fehtl aber noch ein "__stdcall" bei der Definition von DLLFUNC...
    Und am besten wchar_t durch BSTR ersetzen...
    Und "int" durch "unsigned char"...

    Quasi so:

    typedef void (__stdcall *DLLFUNC)(BSTR*,BSTR*,unsigned char);
    


  • Naja, ich lag doch falsch... es muss nicht BSTR und auch nicht wchar_t heissen, sondern LPSTR...

    typedef void (__stdcall *DLLFUNC)(LPSTR,LPSTR,unsigned char);
    

    Siehe auch:
    http://sandsprite.com/CodeStuff/Writing_A_C_Dll_for_VB.html



  • Hallo,

    vielen Dank für die rasend schnellen Antworten.
    Ich habe es euren Beiträgen nach mal umgebaut und bekomme nun keinen Fehler mehr.

    Anbei noch der Code, falls jemand das gleiche Problem bekommt.

    Danke nochmals für die Hilfe!!!!!!!!!!!!!
    und frohes Fest. :xmas1:

    StdAfx.h
    
    typedef void (__stdcall *DLLFUNC)(LPSTR,LPSTR,unsigned char);
    
    ...cpp
    
    CString GetBeispielfunktionFunktion()
    {
        HMODULE handle;
        handle = LoadLibrary("beispiel.dll");
        if (handle==NULL)
            return "Fehler";
    
    	BSTR in=L"513511351";
    	BSTR out [40];
    
    	unsigned char b;
    	b= '6';
    
            if (handle != NULL)
               {
               DLLFUNC func = (DLLFUNC)GetProcAddress(handle, "GetText");
    
               if (func)
                   func(LPSTR)out,(LPSTR)in,b);
            }
    
    return (LPSTR) out;
    }
    


  • Hallo

    so ganz war es das dann doch nicht.. 🙄

    Irgendwas geht bei der Übergabe der Parameten noch schief. Ich bekomme eine Speicherzugriffsverletzung. Wenn ich es so mache, wie vorhergehenden post geschrieben, dann bekomme ich ein BSTR - Array mit 40 <Schlechter pointer> zurück. Kann mir jemand sagen, wie ich

    1. einen BSTR mit 40 Zeichen zeichen erstelle ( BSTR b[40]; ???)
    2. diesen BSTR initialisiere, so dass mir die Zugriffsverletzung erspart bleibt.

    ich bin für jede Hilfe dankbar!

    StdAfx.h
    
    #include <comdef.h>
    
    typedef void (__stdcall *DLLFUNC)(LPSTR,LPSTR,unsigned char);
    
    ...cpp
    
    CString GetBeispielFunktion(CString sIn)
    {
    	HMODULE handle;
    	handle = LoadLibrary("beispiel.dll");
    	if (handle==NULL)
    		return "Fehler";
    
    	CString s;
    	BSTR in=sIn.AllocSysString();
    
    	// 40 Leerzeichen
    	BSTR out=::SysAllocString(L"                                        ");
    
    	sIn.Format("%d",sIn.GetLength());
    	long nLen = sIn.GetLength() + 1;
    	unsigned char* b = new unsigned char [ nLen ];   
    	memcpy( b, sIn.GetBuffer(0), nLen ); 
    
            if (handle != NULL)
                    {
                    DLLFUNC func = (DLLFUNC)GetProcAddress(handle, "GetText");
    
                    if (func)
                            func(LPSTR)out,(LPSTR)in,*b);
                    }
    	s=out;
    
    	// out und in wieder freigeben ?????? 
    
    return (LPSTR) out;
    }
    

Anmelden zum Antworten