Маршаллинг
От: Zubaloo  
Дата: 08.12.14 12:32
Оценка:
Здравствуйте, помогите разобраться со следующей проблемой — далее код куска плагина который я пишу: код на C++ работает, а на C# — нет. Вопрос — почему?

C++
typedef int (*ttkCallback)(int windowID, char *subwindow, char *event, void *data, void *userData);
typedef int (*plugin_function_send)(char *guid, char *event, void *data);

struct account_entry_t 
{ 
    unsigned int                struct_size; 

    char                        *account; 
    char                        *medium; 
    char                        *status; 
    char                        *section; 

    int                        connected; 
    long                        last_connected; 

    HICON                        icon; 
    HWND                        window; 

    ttkCallback                    callback; 
    void                        *data; 
}

plugin_function_send plugin_send;


auto *ae = (struct account_entry_t *)data;
ae->callback = (ttkCallback)accountAdd_callback;
plugin_send(GUID, "accountsAddRequest", ae);


C#
[UnmanagedFunctionPointer(CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public delegate int ttkCallback(int windowID, string subwindow, string eventname, [In, Out]IntPtr data, IntPtr userData);
[UnmanagedFunctionPointer(CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
internal delegate int plugin_function_send(string guid, string eventname, [In, Out, MarshalAs(UnmanagedType.AsAny)]object data);

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
struct account_entry_t
{
    [MarshalAs(UnmanagedType.U4)]
    uint struct_size;

    [MarshalAs(UnmanagedType.LPStr)]
    string account;
    [MarshalAs(UnmanagedType.LPStr)]
    string medium;
    [MarshalAs(UnmanagedType.LPStr)]
    string status;
    [MarshalAs(UnmanagedType.LPStr)]
    string section;

    [MarshalAs(UnmanagedType.I4)]
    int connected;
    [MarshalAs(UnmanagedType.I8)]
    long last_connected;

    [MarshalAs(UnmanagedType.SysInt)]
    IntPtr icon;
    [MarshalAs(UnmanagedType.SysInt)]
    IntPtr window;

    [MarshalAs(UnmanagedType.FunctionPtr)]
    public ttkCallback callback;
    [MarshalAs(UnmanagedType.SysInt)]
    IntPtr data;
}

internal plugin_function_send plugin_send;


var ae = (account_entry_t)Marshal.PtrToStructure(data, typeof(account_entry_t));
ae.callback = accountAdd_callback;
plugin_send(GUID, "accountsAddRequest", ae);
Re: Маршаллинг
От: hardcase Пират http://nemerle.org
Дата: 08.12.14 12:41
Оценка:
Здравствуйте, Zubaloo, Вы писали:

Z>Здравствуйте, помогите разобраться со следующей проблемой — далее код куска плагина который я пишу: код на C++ работает, а на C# — нет. Вопрос — почему?


У вас C++ int какого размера?
/* иЗвиНите зА неРовнЫй поЧерК */
Re: Маршаллинг
От: vit_as Россия  
Дата: 08.12.14 12:44
Оценка:
Здравствуйте, Zubaloo, Вы писали:

А с каким сообщением падает?

С первого взгляда кажется странным, что в структуре на C++ объявлено поле long last_connected; (32 битное), которое в C# представляете как 64 битное.
Re[2]: Маршаллинг
От: Zubaloo  
Дата: 08.12.14 14:46
Оценка:
Здравствуйте, vit_as, Вы писали:

_>Здравствуйте, Zubaloo, Вы писали:


_>А с каким сообщением падает?


_>С первого взгляда кажется странным, что в структуре на C++ объявлено поле long last_connected; (32 битное), которое в C# представляете как 64 битное.



Access violation
PRIMARY_PROBLEM_CLASS: HEAP_CORRUPTION


к своему стыду не знал что C++ long не 64-битный, а 32-х. Поменял на 2 варианта — ни один не сработал:

[MarshalAs(UnmanagedType.I4)]
long last_connected;


[MarshalAs(UnmanagedType.I4)]
int last_connected;
Re[2]: Маршаллинг
От: Zubaloo  
Дата: 08.12.14 14:51
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Здравствуйте, Zubaloo, Вы писали:


Z>>Здравствуйте, помогите разобраться со следующей проблемой — далее код куска плагина который я пишу: код на C++ работает, а на C# — нет. Вопрос — почему?


H>У вас C++ int какого размера?


подозреваю что 32 битный
Re: Маршаллинг
От: Pavel Dvorkin Россия  
Дата: 08.12.14 15:24
Оценка:
Здравствуйте, Zubaloo, Вы писали:

Попробуй на входе в С++ вывести в лог значения всех передаваемых аргументов и полей структуры по формату %x. Далее смотри, что не так.
Или в дебаггере посмотри, если это можно.
With best regards
Pavel Dvorkin
Отредактировано 08.12.2014 15:24 Pavel Dvorkin . Предыдущая версия .
Re[3]: Маршаллинг
От: hardcase Пират http://nemerle.org
Дата: 09.12.14 11:09
Оценка:
Здравствуйте, Zubaloo, Вы писали:

H>>У вас C++ int какого размера?


Z>подозреваю что 32 битный


Проверь на всякий случай
/* иЗвиНите зА неРовнЫй поЧерК */
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.