У меня есть следующие типы в С++:
typedef void* keychain_handle;
typedef struct {
const char* keyHolderName;
unsigned int numKeys;
key* keys;
} key_holder;
typedef struct {
const char* keyName;
unsigned int keySize;
} key;
И у меня есть следующие методы:
int createKeyChain(
int id,
key_holder* keyHolders,
keychain_handle* handle);
Мне нужен мой С# для создания держателей ключей с ключами, отправки его в код С++ и получения дескриптора.
Это мой код С#:
/* Structs */
[StructLayout(LayoutKind.Sequential)]
public struct Key
{
public string key;
public uint size;
}
[StructLayout(LayoutKind.Sequential)]
public struct KeyHolder
{
public string name;
public uint keys;
public IntPtr keys;
}
/* Sync API */
[DllImport("keys.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern uint createKeyChain(uint id, KeyHolder[] keyHolders, ref IntPtr handle);
Key[] myKeys = new Key[1];
myKeys[0] = new Key { key = "tst", size = 5 };
KeyHolder keyHolder = new DllWrapper.KeyHolder
{
name = "tst123",
items = 1,
keys = Marshal.AllocHGlobal(Marshal.SizeOf(typeof (Key))*myKeys.Length)
};
IntPtr c = new IntPtr(keyHolder.keys.ToInt32());
for (int i = 0; i < myKeys.Length; i++)
{
Marshal.StructureToPtr(myKeys[i], c, false);
c = new IntPtr(c.ToInt32() + Marshal.SizeOf(typeof(Key)));
}
Marshal.StructureToPtr(c, keyHolder.keys, false);
IntPtr handle = IntPtr.Zero;
var ret = createKeyChain(111, new []{keyHolder}, ref handle);
Все работает хорошо, за исключением внутренней строки внутри объекта Key, которая повреждена. Я подозреваю, что это StructureToPtr портит его. Как я могу показать строку на стороне С++?
Спасибо.
Key
иKeyHolder
- person nikis   schedule 18.03.2015IntPtr
, а затем маршалировать каждый ключ по отдельности. Потребуется один вызовMarshal.StringToHGlobalAnsi
для каждого элемента массива. Является ли C++/CLI вариантом? - person David Heffernan   schedule 18.03.2015keys
в своей структуреKeyHolder
,m_keys
избыточно - person nikis   schedule 18.03.2015