Маршаллинг
От: 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);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.