Вызов Win32 функции по её адресу
От: Valkov  
Дата: 24.08.06 07:02
Оценка:
Подскажите пожалуйста как из C# вызвать Win32 функцию по её адресу
Например есть функция wglChoosePixelFormatARB библиотеки opengl32.dll
для её использования в текущем контексте для С++ код выглядит так,
и что самое интересное, работает замечательно:

// Определение
extern BOOL WINAPI wglChoosePixelFormatARB (HDC, const int *, const FLOAT *, UINT, int *, UINT *);
typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats);
...
// Использование
wglChoosePixelFormatARB = (PFNWGLCHOOSEPIXELFORMATARBPROC) wglGetProcAddress("wglChoosePixelFormatARB");
...
wglChoosePixelFormatARB(hDC,attr,NULL,1,&format,&count);

Но требуется реализация функции wglChoosePixelFormatARB именно на C#
Для получения адреса:

[DllImport(WGL_NATIVE_LIBRARY, SetLastError = true), SuppressUnmanagedCodeSecurity]
public static extern IntPtr wglGetProcAddress(string extension);

// Получаю адрес функции
IntPtr wgl = wglGetProcAddress("wglChoosePixelFormatARB");

А вот как определить и вызвать функцию wglChoosePixelFormatARB ?
т.к. простой DllImport естественно не работает пишет что, функция в библиотеке не найдена
Через Marshal что то тоже пока не получается
Re: Вызов Win32 функции по её адресу
От: adontz Грузия http://adontz.wordpress.com/
Дата: 24.08.06 07:08
Оценка:
Здравствуйте, Valkov, Вы писали:

V>т.к. простой DllImport естественно не работает пишет что, функция в библиотеке не найдена


Простой DllImport как раз делает то, что тебе надо. Ты им, видимо, неправильно пользуешься.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: Вызов Win32 функции по её адресу
От: Valkov  
Дата: 24.08.06 07:44
Оценка:
Вариант Tao:
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)]
public sealed class IlasmAttribute : Attribute
{
private IlasmAttribute()
{

}

public IlasmAttribute(string msil)
{

}
}

[IlasmAttribute(".maxstack 7\r\nldarg hdc\r\nldarg piAttribIList\r\nldarg pfAttribFList\r\nldarg nMaxFormats\r\nldarg piFormats\r\nldarg nNumFormats\r\nldarg extensionPointer\r\ncalli unmanaged stdcall int32([in]native int,[in]int32[],[in]float32[],[in]int32,[out]int32[],[out]int32)\r\nret")]
public static int wglChoosePixelFormatARB([In] IntPtr extensionPointer, IntPtr hdc, int[] piAttribIList, float[] pfAttribFList, int nMaxFormats, int[] piFormats, out int nNumFormats) { throw new NotImplementedException("IL replacement failure."); }

Вариант мой:
private const CallingConvention CALLING_CONVENTION = CallingConvention.Winapi;


[DllImport("glu32.dll", CallingConvention = CALLING_CONVENTION, EntryPoint = "wglChoosePixelFormatARB"), SuppressUnmanagedCodeSecurity]
public static extern int wglChoosePixelFormatARB([In] IntPtr extensionPointer, IntPtr hdc, int[] piAttribIList, float[] pfAttribFList, int nMaxFormats, int[] piFormats, out int nNumFormats);

Пробовал уже по разному, в плоть до переопределения атрибутов в соответствии с OpenGl 2.1 спецификацией
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.