Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.10.2012, 11:25   #1
Alek67
Новичок
Джуниор
 
Регистрация: 01.10.2012
Сообщений: 2
По умолчанию Маршилинг. Из С++ в С#

Здраствуйте!

Помогите, пожалуйста, разобраться в маршалинге и pinvoke. Точнее есть библиотена на С++ (unmanaged dll) и к ней есть .h файл. Надо перевести нежележащий код из .h файла в С#. Буду очень признателен за помощь!!!
Код:
#define TMK_DATA unsigned short
typedef void (__stdcall *hrtputflags) ( void *pcBuffer, TMK_DATA rtDir, TMK_DATA rtFlagMin, TMK_DATA rtFlagMax );
hrtputflags rtputflags;
typedef TMK_DATA (__stdcall *htmktimeout)(TMK_DATA tmkTimeOut);
htmktimeout tmktimeout;
typedef int (__stdcall *hmrtdefbrcpage)(TMK_DATA mrtBrcPage);
hmrtdefbrcpage mrtdefbrcpage;
typedef DWORD (__stdcall *hMT_Start) (DWORD dwBufSize, HANDLE hEvent);
hMT_Start MT_Start;
typedef DWORD (__stdcall *hMT_GetMessage) (WORD * Data, DWORD dwBufSize, BOOL FillFlag, DWORD * dwMsWritten);
hMT_GetMessage MT_GetMessage;
Alek67 вне форума Ответить с цитированием
Старый 01.10.2012, 14:10   #2
m0nax
Форумчанин
 
Аватар для m0nax
 
Регистрация: 25.09.2009
Сообщений: 525
По умолчанию

типа того, похоже это указатели на функции, значит будут делегатами
Код:
        delegate void rtputflags(IntPtr pcBuffer, ushort rtDir, ushort rtFlagMin, ushort rtFlagMax);
        delegate ushort tmktimeout(ushort tmkTimeOut);
        delegate int mrtdefbrcpage(ushort mrtBrcPage);
        delegate int MT_Start(int dwBufSize, IntPtr hEvent);
        delegate int MT_GetMessage(ref short Data, int dwBufSize, bool FillFlag, IntPtr dwMsWritten);
c последним могут быть проблемы, хз как этот WORD* правильно завернуть, там надо уже по ситуации смотреть что за Data такая, может и ref short сгодится, а может и Intptr вместе с [MarshalAs(UnmanagedType.U2)]
m0nax вне форума Ответить с цитированием
Старый 01.10.2012, 14:53   #3
Alek67
Новичок
Джуниор
 
Регистрация: 01.10.2012
Сообщений: 2
По умолчанию

Еще такой вопрос. К этой библиотеке еще приложен файл .cpp, в котором обозначены точки входа.
Код:
HINSTANCE hDrvDll = NULL;

DWORD DrvOpen()
{
  if(!hDrvDll)
    hDrvDll = LoadLibrary("WDMTMKv2.dll");


  if(hDrvDll != NULL)
  {
    if(!(MT_Start = (hMT_Start) GetProcAddress(hDrvDll, "_MT_Start@8")))
      return 0;
    if(!(MT_GetMessage = (hMT_GetMessage) GetProcAddress(hDrvDll, "_MT_GetMessage@16")))
      return 0;
    if(!(MT_Stop = (hMT_Stop) GetProcAddress(hDrvDll, "_MT_Stop@0")))
...
Как правильно будет их перевести в С#:
Код:
            public static System.IntPtr hDrvDll = null;

	public static uint DrvOpen()
		{
	  if (!hDrvDll)
		hDrvDll = new System.IntPtr();


	  if (hDrvDll != null)
		  {
		if (!(MT_Start() = DLLMethod))
		  return 0;
		if (!(MT_GetMessage() = DLLMethod))
		  return 0;
		if (!(MT_Stop() = DLLMethod))
		  return 0;
                      }

	[DllImport("WDMTMKv2.dll", EntryPoint="_MT_Start@8")]
	internal static extern uint DLLMethod(uint dwBufSize, System.IntPtr hEvent);
	[DllImport("WDMTMKv2.dll", EntryPoint="_MT_GetMessage@16")]
	internal static extern uint DLLMethod(ref ushort Data, uint dwBufSize, int FillFlag, ref uint dwMsWritten);
	[DllImport("WDMTMKv2.dll", EntryPoint="_MT_Stop@0")]
	internal static extern uint DLLMethod();

Последний раз редактировалось Alek67; 01.10.2012 в 14:57.
Alek67 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц