Мне нужно решить эту проблему. У меня есть структура (StructA), которая содержит указатель на вторую структуру. Вторая структура имеет целочисленную переменную.
В приведенном ниже коде у меня есть процедура C (GetStrucure ()). Я хочу установить целочисленное значение в переменную ValB в StructB. StructA содержит указатель на StructB. GetStrucure () возвращает StructA. Это работает правильно.
В коде C # я хочу вызвать GetStrucure () из формы C dll. ValA возвращается правильно, но ValB возвращает неправильное значение 3207020. Почему значение из указателя неверно?
struct StructB
{
int ValB;
};
struct StructA
{
StructB* S;
int ValA;
};
и процедура:
extern "C"
{
__declspec(dllexport) StructA GetStrucure()
{
StructA sA;
StructB sB;
sB.ValB = 5;
sA.S = &sB;
sA.ValA = 6;
return sA;
}
}
и код C #:
[StructLayout(LayoutKind.Sequential]
public struct StructA
{
public StructB S;
public int ValA;
}
[StructLayout(LayoutKind.Sequential)]
public struct StructB
{
[MarshalAs(UnmanagedType.I4)]
public int ValB;
}
class Program
{
[DllImport("TestLib.dll", CallingConvention = CallingConvention.Cdecl)]
static extern StructA GetStrucure();
static void Main(string[] args)
{
StructA a = GetStrucure();
}
}
Я тоже пытался
[StructLayout(LayoutKind.Sequential]
public struct StructA
{
public IntPtr S;
public int ValA;
}
и
StructB b = (StructB)Marshal.PtrToStructure(a.S, typeof(StructB));
Но я получил другое бессмысленное значение ...
Пожалуйста, может ли какое-нибудь тело помочь мне?