2010-02-06 101 views
0

我需要關於自定義編組的幫助..我有一個本地DLL。一些DLL函數的參數用無符號字符定義*需要幫助自定義編組.. ..?

例如;

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

,我已描述如下的函數的參數的文件;

輸入參數:

  • HCOM串口處理固件程序的
  • 主要-主版本號
  • 固件程序的輕微的顛覆號
  • 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警告時使用它。不要忘記將您的項目的Platform Target設置爲x86,否則會在64位操作系統上彈出。

+0

感謝feedback..i已經設置了目標平臺的x86像你said..another問題是文檔解釋了functions..sometimes一個小東西我不能確定我應該do..the SDK的設備containsa LIB file..i打開的lib用一個編輯器和我遇到裝飾names.i未修飾與undname.exe..the結果如下這些修飾的名; undname?DrfGetFirmwareVersion @@ YGFPAXPAE1E @ Z ---- >>>>短__stdcall DrfGetFirmwareVersion(無效*,無符號字符*,無符號字符*,無符號字符) – 2010-02-06 15:34:22

+0

PS 「*」 是沒有看到該函數的第一參數。可能如下: void * – 2010-02-06 15:43:19

+0

您需要在聲明中使用DllImport.ExactSpelling屬性。 – 2010-02-06 16:20:19

0

我已經使用overloed爲.I已導入功能如下默認參數(VS2005);

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); 
       } 
     } 

請問您是否可以驗證我?