none
如何在c# 中呼叫一個DLL的函式,其參數包含字串指標? RRS feed

  • 問題

  • 假設我要調用的 DLL 為 "TEST.dll", 在此之中有一個函式為 int Function (char *dbuf, char *sbuf );

    這個函式的作用是處理sbuf所指向的一串資料,然後會將結果資料放到 buf 所指向的位址

    在 c 語言裡面,可能會是這樣

    char buf1[50];

    int i;

    i = Function (buf1, "123" );    // 執行完後,buf1[] 裡面就會有我要的資料

    但是在 C# 中我就不知道要怎麼做了,請教各位!

     

    2009年2月10日 上午 08:16

解答

所有回覆

  •  其實我現在要用的函式原型是長這樣:
    (此DLL是用VC寫的)

      extern "C" __declspec(dllexport) int __stdcall CommTagIDGet(char *tag_id, int second);  
     

    此函式會將我們要的資料存放到 *tag_id所指向的位址
    執行成功會回傳 1,失敗則是回傳 0
    然後我在 C# 中實作如下:


    1  [DllImport("WCEComm.dll")]  
    2  public static extern int CommTagIDGet(ref string tag_id, int second);  
    3  
    4  private void button3_Click(object sender, EventArgs e)  
    5  {  
    6      int i;  
    7      string tag_id = "";  
    8       
    9      i = CommTagIDGet(ref tag_id, 1);  
    10   
    11      if (i != 0)  
    12      {  
    13          textBox1.Text = "ok";  
    14      }  
    15      else 
    16      {  
    17          textBox1.Text = "Fail.";  
    18      }  
    19
    20  } 

    目前編譯是沒問題,但執行時,若 return 0 則程式沒有發生問題
    若不是 return 0,則機器會出現錯誤:

    「OOOO.exe 中發生了本機異常。請選擇"退出"然後重新啟動此程序,或者選擇"詳細信息"以獲得更多信息。」

    點擊"詳細信息"後,出現的是

    異常代碼:0x80000002
    異常地址:0x00c12b20


    附帶一提,我是在智慧型裝置上面run(目前是用一台HP的PDA在測,大陸買的,所以會有一些大陸用語)

    請問我的CODE是哪裡錯了呢?

    因為之前完全沒碰過C#或JAVA,只有用過C/C++,所以請多包涵。謝謝!






    2009年2月11日 上午 03:46
  • Maybe need to use callingconvention.stdcall
    [DllImport("WCEComm.dll",charset=charset.auto,callingconvention=callingconvention.stdcall)]
    2009年2月11日 下午 01:39
  • 可是我在 CallingConvention. 的後面,只看到 Winapi 可以選,如下:

    [DllImport("WCEComm.dll", CharSet=CharSet.Auto, CallingConvention=CallingConvention.Winapi)]


    2009年2月12日 上午 03:14
  • Sorry...看了一下..手持裝置只支援CallingConvention.Winapi

    CallingConvention Enumeration
    http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.callingconvention.aspx
    2009年2月12日 上午 05:22
  • 已解決,用 byte[] 就可以了
    • 已標示為解答 odin_sunion 2009年2月16日 上午 07:53
    2009年2月16日 上午 07:53