2010-02-06 3 views
0

Мне нужна помощь о пользовательском маршалинге .. У меня есть родная DLL .. параметры некоторых функций DLL определены с unsigned char *нужна помощь на заказ маршалинг ..?

например;

typedef short apiStatus; 
    apiStatus __declspec(dllexport) __stdcall DrfGetFirmwareVersion (HANDLE hCom, unsigned char *major,unsigned char *minor, unsigned char ReaderAddr = 0xff); 

документация, в которой я описываю аргументы функции следующим образом;

Входной параметр:

  • hCom-последовательный порт обрабатывать
  • мейджор-основной версии No. программы прошивки
  • минорной подрывной номер программы прошивки
  • ReaderAddr- адрес читателя, для фиксированное считывающее устройство RS485, значение по умолчанию «0XFF» (не применяется для карманных и модулей)

как я могу объявить эту функцию в C# .. ??

Любая помощь на все действительно было бы оценен

ответ

1

Если эта DLL действительно, очень старые (назад, когда символ был еще без знака), то это может быть возвращение строк. Это очень маловероятно, хотя, просто объявить их как из байта:

[DllImport("blah.dll")] 
private static extern noidea DrfGetFirmwareVersion(IntPtr handle, 
    out byte major, out byte minor, byte address); 

Где «noidea» предположительно является недействительным или каким-то код ошибки INT. Еще одна вещь, о которой нужно беспокоиться, это свойство DllImport.CallingConvention, это может быть Cdecl. Используйте это, когда вы получаете предупреждение MDA о дисбалансе стека. И не забудьте установить целевую платформу вашего проекта на x86 или он будет бомбить в 64-битных операционных системах.

+0

спасибо за отзыв..i установили платформу на x86, как вы сказали ... Другая проблема заключается в том, что документация объясняет некоторые вещи для функций. Иногда я не мог определить, что я должен делать. SDK устройства содержит файл lib..i открыл lib с помощью editör, и я столкнулся с украшенными именами. Я не украсил эти декорированные имена с помощью undname.exe ... результатов следующим образом; undname? DrfGetFirmwareVersion @@ YGFPAXPAE1E @ Z ---- >>>> short __stdcall DrfGetFirmwareVersion (void *, unsigned char *, unsigned char *, unsigned char) –

+0

PS «*» не отображается первый параметр функции. .it может быть следующим: void * –

+0

Вам нужно будет использовать свойство DllImport.ExactSpelling в вашей декларации. –

0

Я использовал overloed для параметра по умолчанию (VS2005) .i импортировал функцию следующим образом;

public class sDrfGetFirmwareVersion 
     { 
      //apiStatus __declspec(dllexport) __stdcall DrfGetFirmwareVersion (HANDLE hCom, unsigned char *major,unsigned char *minor, unsigned char ReaderAddr = 0xff); 

      [DllImport("DrfApiV10.dll", CallingConvention = CallingConvention.StdCall,CharSet=CharSet.Ansi,EntryPoint="DrfGetFirmwareVersion", ExactSpelling=false)] 
      public static extern short DrfGetFirmwareVersion(IntPtr hCom, out byte major, out byte minor,byte ReaderAddr); 
      public static short DrfGetFirmwareVersion(IntPtr hCom, out byte major,out byte minor) 
       { 
        return DrfGetFirmwareVersion(hCom, out major,out minor, 0xff); 
       } 
     } 

Вы можете подтвердить меня пожалуйста ??

Смежные вопросы