2010-10-24 6 views
4

В этом проблема - у меня есть библиотека обработки изображений C, которую мне нужно использовать из приложения C#. На данный момент мне не хватает опыта работы с DllImport.C# Marshalling char ** и unsigned char **

Функция мне нужно использовать выглядит следующим образом:


    IMAGEPROCESS_API const int importImage 
     (
     const unsigned char* image, 
     const char* xmlInput, 
     unsigned char** resultImage, 
     char** xmlOutput 
     ); 

Таким образом, он принимает исходные данные изображения, содержащие параметры XML и width'height изображение, а затем возвращают обработанное изображение и некоторый отчет в формате XML.

Сейчас им пытаются подойти к нему так:

 
[DllImport("imageprocess.dll",CallingConvention = CallingConvention.StdCall,EntryPoint = "importImage",CharSet=CharSet.Ansi)] 
     private static extern int ImportImageNative(IntPtr imageData, String xmlDescriptor, out IntPtr processedImage, out IntPtr xmlOut); 

, но без какого-либо успеха.

Любые предложения, как это сделать?

Edit: еще не повезло (( не сделал это с помощью CLI неаккуратно C++ на текущий

+0

вы могли бы предоставить более подробную информацию о «без какого-либо успеха»? – Dialecticus

+0

О, он компилируется и запускается, но сталкивается с нарушением прав доступа, поэтому что-то действительно не так. Я дважды проверил ввод xml, поэтому считаю, что проблема с выходом – ALOR

ответ

3

Для выходных параметров, вы должны получить доступ к возвращаемые данные, используя Marshal.PtrToStringAnsi

Поскольку исходная память была выделена внутри. неуправляемый API, вы по-прежнему несете ответственность за его освобождение.

Я также думаю, что вы должны использовать String для обоих первых двух параметров, не знаете, почему первый из них является ?

+0

Поскольку я сразу получаю IntPtr System.Drawing.Bitmap.GetHBitamp(); – ALOR

+0

@ALOR - Понятно, что это не C-строка, и у вас все в порядке. Думаю, это «Битмап», а не «Битэмп». –

+0

Yeap, sry для орфографической ошибки – ALOR

0

Попробуйте

[DllImport("imageprocess.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    static extern int importImage(string imageData, string xmlDescriptor, out string processedImage, out string xmlOut); 
+0

Хорошо, но как мне «наложить» байт [] на строку и наоборот? – ALOR

+0

ОК означает, что он работал (как в - не разбился)? Какой байт [] вы имеете в виду? Подписанная вами подпись имеет только массивы символов/указатели –