Autor Beitrag
muehlbacher
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Di 16.10.07 15:43 
Hallo!

Ich möchte eine dll in c# einbinden(driver.dll). Die Spezifikation für den Dll-Zugriff(verwendete Datentypen) habe ich aus einem Header-Files(c++) herausgelesen. Möchte nun mit meiner C# Applikation die dll-Befehle aufrufen können. Meistens funktioniert die Aufrufe problemlos.

Aber es treten auch Exception bzw. Errormeldungen auf:

z.Bsp.:

Error1:
FatalExecutionEngineError was detected
Message: The runtime has encountered a fatal error. The address of the error was at 0x79eea33a, on thread 0x484. The error code is 0xc0000005. This error may be a bug in the CLR or in the unsafe or non-verifiable portions of user code. Common sources of this bug include user marshaling errors for COM-interop or PInvoke, which may corrupt the stack

Error2:ExecutionEngine Exception was thrown

Error3:
Fehler in Anwendung:
Die Anweisung in “0x01217c48” verweist auf Speicher in “0x3f0000b0“ Der Vorgang Written konnte nicht auf dem Speicher durchgeführt werden.


Solche Fehlermeldungen können durch den dll-import von unmanaged code.
Problem:Bei welchen Imports liegen ich mit meine Deklarationen falsch.

Ich habe leider keine Ahnung wo sich das Problem versteckt.
Danke schon mal für eure Hilfe

Markus

verwende Framework 2.0



ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
[StructLayout (LayoutKind.Sequential, Pack=1)]
        public struct _cfg
        {
            public Int16 version;
            [MarshalAs(UnmanagedType.ByValArray ,SizeConst=14)]
            public char[] serial;
           
            public _channel Channel0;
            public _channel Channel1;
            public _channel Channel2;
            public _channel Channel3;
            public _channel Channel4;
            public _channel Channel5;
            public _channel Channel6;
            public _channel Channel7;
        }


        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        public struct _channel
        {
            public float highpass;
            public float lowpass;
            public float sensitivity;
            public float samplerate;
            public char polarity;
        }

        [StructLayout (LayoutKind.Sequential,Pack=1)]
        unsafe public struct Buffer // structure used to handle buffers
        {
            public short* pBuffer;
            public UInt32 size;       // Buffersize in bytes: max. 1024 bytes
public UInt32 validPoints; // number of data points returned from driver 
            //data point size is 2 bytes
        }

      
         [DllImport("driver.dll")]
         static extern IntPtr GT_OpenDevice([MarshalAs(UnmanagedType.LPStr)] string lpPort);
        
    [DllImport("driver.dll")]
       static extern bool GT_GetData(IntPtr hDevice, ref Buffer buffer, out System.Threading.NativeOverlapped lpovl);

         [DllImport("driver.dll")]
   private static extern bool GT_GetConfig(IntPtr hdevice, IntPtr p_cfg);


public bool GetConfig(IntPtr hdevice, out _cfg ConfigMobilLab)
        {
            bool ret;
            ret = false;
            IntPtr p_cfg1 = Marshal.AllocHGlobal(4);
            ret = GT_GetConfig(hdevice, p_cfg1);
            ConfigMobilLab = (_cfg)Marshal.PtrToStructure(p_cfg1, typeof(_cfg));
            Marshal.FreeHGlobal(p_cfg1);
            return ret;
        }


ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
c++ Code(Header-File)

typedef struct // structure used to handle buffers
{
  SHORT   *pBuffer;    // Pointer to buffer
  UINT  size;       // Buffersize in bytes: max. 1024 bytes
  UINT    validPoints; // number of data points returned from driver 
}_BUFFER_ST;       // (data point size is 2 bytes)

typedef struct
{
  float highpass;
  float lowpass;
  float sensitivity;
  float samplerate;
  char polarity;
}__channel;

typedef struct
{
  __int16 version;
  char serial[14];
  __channel channels[8];
}__cfg;

GMOBILABPLUS_API HANDLE __stdcall GT_OpenDevice(LPSTR lpPort);

GMOBILABPLUS_API BOOL __stdcall GT_GetData(HANDLE hDevice,_BUFFER_ST *buffer,LPOVERLAPPED lpOvl);

GMOBILABPLUS_API BOOL __stdcall GT_GetConfig(HANDLE hdevice, __cfg * cfg);