проблем с pinvoke
1 отговора
96 прегледа
проблем с pinvoke
Опитвам се от .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 на С++, който да направи маршалинга до по-.НЕТ-дружелюбни типове?
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 на С++, който да направи маршалинга до по-.НЕТ-дружелюбни типове?
Re: проблем с pinvoke
e dobre de, a tova njama li da ti svyrshi rabota:
[линк] ????
There are 10 types of people in this world one who understand binary jokes and one who not
[линк] ????
There are 10 types of people in this world one who understand binary jokes and one who not