none
關於C++ DLL的使用方式 RRS feed

  • 問題

  • 1.想請教DllImport 參數的用法 例如CharSet的用處是甚麼? 看了msdn CharSet 列舉還是不太理解各種值得差異

    2.很多DLL雖然有文件,但是沒有實際語法的範例,想請教該如何轉換成C#來使用呢?

    ---------------

    例如(1)

    Syntax:
    int GetDllVersion(LPTSTR version, int size);

    Parameters:

    version   [out] 輸出 Buffer(UTF16)
    size  [in] 輸出 Buffer長度,建議256 bytes

    C#:

    public unsafe static extern int GetDllVersion(String version, int size);

    但是實際使用version並不會變更值,將String變更為String* 或是使用 ref 都會有錯誤

    (2)

    Syntax:

    int GetPicture(int nHandle, int nPortID, void * lpBuf, int nBufLen, int nQuality, int * nWidth, int * nHeight, int nBits);   

    Parameters:

    lpBuf   [in] 存放擷取圖像的內存地址指針

    C#

    void *  在C#該使用甚麼型別?

    想請教有沒有關於使用C++ DLL的教學

    2018年7月24日 上午 03:26

解答

  • 1) 因為Windows API有分ASCII版和Unicode版, 所以需要用CharSet區分

    2) 有一個網站還不錯, 可以參考看看:https://pinvoke.net

    3) void *可以直接宣告成IntPtr

    • 已標示為解答 StuBoo 2018年7月25日 上午 07:25
    2018年7月24日 上午 03:38
  • .Net framework 沒有定長度字串,此外 在與 DLL 呼叫時,因為記憶體模型不同,需要封裝遞送變數,所以在 .Net 內,參考型別跟結構很不好處理。

    萬無一失的方式是用Byte陣列收。

    字串可能會透過 StringBuilder 或先塞 buffer 的 Chr(0) 來處理長度問題。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    • 已標示為解答 StuBoo 2018年7月25日 上午 07:25
    2018年7月24日 下午 03:00

所有回覆

  • 1) 因為Windows API有分ASCII版和Unicode版, 所以需要用CharSet區分

    2) 有一個網站還不錯, 可以參考看看:https://pinvoke.net

    3) void *可以直接宣告成IntPtr

    • 已標示為解答 StuBoo 2018年7月25日 上午 07:25
    2018年7月24日 上午 03:38
  • .Net framework 沒有定長度字串,此外 在與 DLL 呼叫時,因為記憶體模型不同,需要封裝遞送變數,所以在 .Net 內,參考型別跟結構很不好處理。

    萬無一失的方式是用Byte陣列收。

    字串可能會透過 StringBuilder 或先塞 buffer 的 Chr(0) 來處理長度問題。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    • 已標示為解答 StuBoo 2018年7月25日 上午 07:25
    2018年7月24日 下午 03:00