?

Log in

No account? Create an account

Сложный DllImport в .NET (C#)

  • Feb. 29th, 2008 at 10:01 PM
karuchiferu
Понадобилось сегодня заимпортить в .NET проект несколько функций из своей DLLки, написанной на С. До этого мне приходилось импортить только некоторые функции Win32API, типа SendMessage или MessageBeep, так что проблем не возникало. А вот в той функции, которую мне понадобилось заимпортить - передается структура, содержащая 39 различных полей, 2 из которых - указатели на callback функции, в которые в свою очередь передаются другие структуры еще по 8 разных параметров :) В общем, столкнулся с некоторыми проблемами с определениями полей структуры, решение которых хочу описать ниже. И себе будет полезно, чтобы не забыть, и еще может кому пригодится.

Рассмотрим следующий пример (не ищите глубокого смысла в типах параметров, я просто собрал все в кучу, чтобы можно было потом посмотреть и понять, как нужно подогнать код под вашу конкретную задачу).

Предположим, в DLL у нас объявлена функция UnmanagedFunction, имеющая следующее определение:

int WINAPI UnmanagedFunction (BunchOfParameters * params);

Как видно, функция принимает 1 параметр - структуру BunchOfParameters, которая определяется следующим образом:

struct BunchOfParameters  {        
    OUT WCHAR * pszPointerToWideStringBuffer; // указатель на буфер где-то в памяти
    IN WCHAR szWideStringBuffer[128]; // буфер, хранящийся в самой структуре
    IN CallbackFunc lpfnCallbackFunc; // указатель на callback функцию
    IN const WCHAR * pszPointerToWideStringConstant; // указатель на строку константу
    IN int justAnInteger; // просто целое для примера
    IN float justAFloat; // просто 4х байтовое число с плавающей точкой
};

CallbackFunc здесь - обычная callback функция, например такая:
Read more...Collapse )