System.AccessViolationException при вызове C ++ dll

Я пытаюсь заставить Java Access Bridge (2.02) работать с C # (.NET 3.5 ). У меня он работает для некоторых функций, но когда я вызываю функцию, которая ссылается на структуру (getAccessibleContextInfo), я получаю это сообщение об ошибке: System.AccessViolationException: попытка чтения или записи в защищенную память. Это часто указывает на то, что другая память повреждена.

Вот мой код:

[DllImport("Windowsaccessbridge.dll", CallingConvention = CallingConvention.Cdecl)]
internal extern static void Windows_run();

[DllImport("Windowsaccessbridge.dll", CallingConvention = CallingConvention.Cdecl)]
private extern static void releaseJavaObject(long vmID, IntPtr javaObject);

[DllImport("Windowsaccessbridge.dll", CallingConvention = CallingConvention.Cdecl)]
private extern static bool isJavaWindow(IntPtr window);

[DllImport("Windowsaccessbridge.dll", CallingConvention = CallingConvention.Cdecl)]
private extern static bool getAccessibleContextInfo(long vmID, IntPtr ac, out AccessibleContextInfo textInfo);

[DllImport("Windowsaccessbridge.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern bool getAccessibleContextFromHWND(IntPtr hwnd, out long vmID, out IntPtr ac);

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct AccessibleContextInfo
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024)]
public string name;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024)]
public string description;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string role;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string role_en_US;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string states;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string states_en_US;

[MarshalAs(UnmanagedType.I4)]
public int indexInParent;
[MarshalAs(UnmanagedType.I4)]
public int childrenCount;
[MarshalAs(UnmanagedType.I4)]
public int x;
[MarshalAs(UnmanagedType.I4)]
public int y;
[MarshalAs(UnmanagedType.I4)]
public int width;
[MarshalAs(UnmanagedType.I4)]
public int height;

[MarshalAs(UnmanagedType.Bool)]
public bool accessibleComponent;
[MarshalAs(UnmanagedType.Bool)]
public bool accessibleAction;
[MarshalAs(UnmanagedType.Bool)]
public bool accessibleSelection;
[MarshalAs(UnmanagedType.Bool)]
public bool accessibleText;
[MarshalAs(UnmanagedType.Bool)]
public bool accessibleInterfaces;
};

private void Form1_Load(object sender, EventArgs e)
{
Windows_run();
}

private void button1_Click(object sender, EventArgs e)
{
long vmID;
IntPtr ac;
if (getAccessibleContextFromHWND(mainWindowHwnd, out vmID, out ac))
{
MessageBox.Show("Got Context: " + vmID.ToString() + ", " + ac.ToString());
AccessibleContextInfo info;

if (getAccessibleContextInfo(vmID, ac, out info)) //this is where the error is thrown
{
MessageBox.Show("Got Context Info: " + info.name);
}
else
{
MessageBox.Show("Getting info failed");
}
}
else
{
MessageBox.Show("Accessing failed");
}
}

Я не думаю, что это проблема с java dll, поскольку она отлично работает с примером программы C ++, которая поставляется с API.

По результатам поиска в Google я догадываюсь, что проблема связана с тем, как я упорядочиваю структуру AccessibleContextInfo , но я не знаю, как это сделать правильно.

Вот как структура объявляется в "AccessBridgePackages.h" примера программы

#define MAX_STRING_SIZE   1024
#define SHORT_STRING_SIZE   256

typedef struct AccessibleContextInfoTag {
    wchar_t name[MAX_STRING_SIZE];      // the AccessibleName of the object
    wchar_t description[MAX_STRING_SIZE];   // the AccessibleDescription of the object

    wchar_t role[SHORT_STRING_SIZE];    // localized AccesibleRole string
    wchar_t role_en_US[SHORT_STRING_SIZE];  // AccesibleRole string in the en_US locale
    wchar_t states[SHORT_STRING_SIZE];  // localized AccesibleStateSet string (comma separated)
    wchar_t states_en_US[SHORT_STRING_SIZE]; // AccesibleStateSet string in the en_US locale (comma separated)

    jint indexInParent;         // index of object in parent
    jint childrenCount;         // # of children, if any

    jint x;                 // screen coords in pixels
    jint y;                 // "
    jint width;             // pixel width of object
    jint height;                // pixel height of object

    BOOL accessibleComponent;           // flags for various additional
    BOOL accessibleAction;          //  Java Accessibility interfaces
    BOOL accessibleSelection;       //  FALSE if this object doesn't
    BOOL accessibleText;            //  implement the additional interface
                                                //  in question

    // BOOL accessibleValue;                // old BOOL indicating whether AccessibleValue is supported
    BOOL accessibleInterfaces;      // new bitfield containing additional interface flags

    } AccessibleContextInfo;

Любая помощь приветствуется!

6
задан John Saunders 20 October 2012 в 12:57
поделиться