[DllImport]Falsche Werte bei wrapperstruktur?

Hallo liebe Community,

beim testen von Wrapperstrukturen und Function Pointer ist mir ein seltsamer Fehler aufgefallen ...
Momentan versuche ich einfach nur, 2 uint werte in einer "Point" Struktur zu halten und die struktur über eine native Funktion zu erstellen.

Code:
C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;

namespace Testanwendung
{
    internal static class Program
    {
        internal static void Main(string[] Arguments)
        {
            Point Zero = GetZeroPoint();
            Console.WriteLine("{0}:{1}", Zero.X, Zero.Y);
            Console.ReadKey();
        }

        [DllImport("NativeDLL.dll")]
        internal static extern Point GetZeroPoint();
    }

    public struct Point
    {
        public Point(uint XPosition, uint YPosition)
        {
            this.X = XPosition;
            this.Y = YPosition;
        }

        public uint X;
        public uint Y;
    }
}
C++:
//Point.hpp
#ifndef POINT_HPP_
#define POINT_HPP_

struct Point
{
	public:
		Point(unsigned long int XPosition, unsigned long int YPosition);
		
		unsigned long int X;
		unsigned long int Y;
};

#endif
C++:
//Point.cpp
#include "Point.hpp"

Point::Point(unsigned long int XPosition, unsigned long int YPosition)
{
	this->X = XPosition;
	this->Y = YPosition;
}
C++:
//StdFunc.hpp
#ifndef STDFUNC_HPP_
#define STDFUNC_HPP_

#include "Point.hpp"
#include "dllmain.hpp"

extern "C"
{
	DllExport Point GetZeroPoint();
};
#endif
C++:
//StdFunc.cpp
#include "StdFunc.hpp"

Point GetZeroPoint()
{
	return Point(0, 0);
};

In meiner Point Variable "Zero" bekomme ich beim debuggen aber folgenden Wert raus:
X 3730892 uint
Y 1831876848 uint

Bin ich zu blöd, über eine native Funktion einen Nullpunkt zu erstellen oder failt meine Anwendung einfach nur?

Gruß, JustShinigami
 
Hi.

Vermutlich paßt einfach das Layout der Struktur nicht.

C#:
[StructLayout(LayoutKind.Sequential, Pack=1)]
struct Point {
...
}
 
hallo deepthroat.
Ich kanns grade zwar nich testen, aber wenn das die lösung ist, wie kommt es dann zu diesen äußert merwürdigen Zahlen, die ja scheinbar gar nichts mit 0 zu tun haben?

gruß, JustShinigami
 
Wenn das Layout falsch ist, dann wird irgendwelcher Speicher für die Werte der Member ausgelesen, was dann zu undefiniertem Verhalten führt.

Was ich gestern übersehen hatte, war das du da eine C++ Struktur - mit Konstruktur - als Rückgabetyp verwenden willst.

Das ist mit einer C Bindung für die Funktion nicht erlaubt - und führt ebenfalls zu undefiniertem Verhalten.
 
Zurück