|
Тема |
проблем с pinvoke |
|
Автор |
Skotowydec (disable:4786) |
|
Публикувано | 03.12.03 10:54 |
|
|
Опитвам се от .NET да извикам DLL със следната функция:
struct Foo {
// only ints, shorts and bytes here
};
int FooBar(Foo **ppFoos, int *pCount);
Тя алокира памет, слага там определен брой структури Foo, връща указател към тази памет в *ppFoos, и връща броя им в *pCount.
Доколкото разбрах от RTFMSDN, няма начин това да се направи официално -
в тази посока се поддържа маршалинг или на променлив по размер масив от примитивни типове, или на фиксиран по размер масив от произволни структури, но не променлив масив от произволни структури.
В изблик на отчаяние се опитах да го прочета в масив byte[] с IntPtr и Marshal.Copy, както в един от техните примери, но пак нещо не е наред - получавам null reference exception на извикването на Marshal.Copy, когато се опитам да прочета пълния размер данни от IntPtr-то (count * sizeof);
когато чета примерно половината данни, не гърми. (И преди да сте попитали, да, sizeof-ите на структурите от двете страни на маршалинга са еднакви.)
Някаква идея? Как е морално правилно да извикам тази функция, или ще се наложи да си пиша wrapper DLL на С++, който да направи маршалинга до по-.НЕТ-дружелюбни типове?
|
| |
|
|
|