none
interop mit c++ Vorlage RRS feed

  • Frage

  • Hallo, 

    Ich habe ein !funktionierendes! c++ Interop beispiel, welches ich auf c# umbauen müsste. 

    Die Vorlage: 

    #define EXP __declspec(dllimport)
    
    typedef enum {	
    	RC_OK = 0x0000,				
    	RC_NAK_COMMAND = 0x1001,	
    	RC_NAK_COMMAND_LENGTH,....
    ... 
    
    ....
    
    
    
    typedef struct {
    	int					OutNo;			// OUT No(0-11)
    	LKIF_FLOATRESULT	FloatResult;	// valid or invalid data
    	float				Value;			// Measurement value
    } LKIF_FLOATVALUE_OUT;
    
    
    extern "C"
    {
    
    EXP RC WINAPI LKIF2_GetCalcDataSingle(IN int OutNo,OUT LKIF_FLOATVALUE_OUT * CalcData);
    
    ...


    Im Beispielcode wird der Befehl mit folgenden Parametern erfolgreich ausgeführt: 

    RC rc = LKIF2_GetCalcDataSingle((outNo),&value);

    mit outNo =0 und value=value = {OutNo=3275448 FloatResult=LKIF_FLOATRESULT_VALID (0) Value=6.866e-44#DEN }

    erhält man: rc = RC_OK (0) und value = {OutNo=1 FloatResult=LKIF_FLOATRESULT_VALID (0) Value=-14.8599997 }

    Ich habe die Codes selbst in C# übersetzt: 

    namespace PruefStation.HW.LK
    {
        class LkApi
        {
    
    
            // Return Code List
            public enum RC
            {
                RC_OK = 0x0000,     
                RC_NAK_COMMAND = 0x1001,    // Command error
                RC_NAK_COMMAND_LENGTH,      // Command length error
    ...
    ...
    
     // Measurement value
            [StructLayout(LayoutKind.Sequential)]
            public struct LKIF_FLOATVALUE_OUT
            {
    
                int OutNo;          // out No(0-11)
                LKIF_FLOATRESULT FloatResult;   // valid or invalid data
                float Value;            // Measurement value
            }
            ;
    ...
     [DllImport("LKIF2.dll", CallingConvention = CallingConvention.Winapi)] public static extern RC LKIF2_GetCalcDataSingle(in int OutNo, out LKIF_FLOATVALUE_OUT CalcData);

    Wie folgt ausgeführt: 

     LKIF_FLOATVALUE_OUT data;

     RC ret = LkApi.LKIF2_GetCalcDataSingle(0, out data);

    gibt einen Fehler zurück:

    RC_NAK_OUT_HEAD_NUM // No. of used head/out over error

    Kann man der Fehlermeldung vertrauen, wurde der Integer-Wert nicht korrekt an die Funktion weitergeleitet, also die 0 ist in der Unmanaged DLL scheinbar keine 0 mehr. 

    Könnt ihr mir sagen, was ich hier falsch machen könnte?

    Dienstag, 27. August 2019 16:50

Antworten

  • Hallo,

    das mit c/c++ ist nun ganz lange her, was ich finde ist aber:
    https://github.com/tbscer/Reader/blob/master/Reader/LKIF.cs

    Dort ist mindestens mal die structur LKIF_FLOATRESULT  als enum übersetzt.
    Schau Dir das Projekt an. Es sollte Dir weiterhelfen.
    HTH

    Grüße Alexander

    • Als Antwort markiert rogi1 Samstag, 31. August 2019 16:07
    Mittwoch, 28. August 2019 07:33