none
C#开发 调用非托管代码问题,望高手解救! RRS feed

  • 問題

  • 在C#中通过DllImport调用VC6编写的dll,结果出现“尝试读取或写入受保护的内存,这通常指示其他内存已损坏”的错误,抛出accessViolationException异常。
    函数原型:
    extern "C" BOOL SMEILIB_DECLSPEC GetDeliverMsg

                                             (OUT LPTSTR sMsgContent,
                                                   IN int nMsgLength,
                                                   OUT LPTSTR sSrcAddr,
                                                   OUT LPTSTR sDesAddr,
     OUT int *nIsRegSync,
     OUT LPTSTR sRegState);
    定义:
     [DllImport("sp_smpp.dll")]
            public static extern bool GetDeliverMsg(out string sMsgContent,
            int nMsgLength,
            out string sSrcAddr,
            out string sDesAddr,
            out int nIsRegSync,
            outstring sRegState);
            #endregion
    调用出错,如何处理


     

    2007年4月16日 上午 08:06

解答

  • 試試看把所有 OUT LPTSTR 對應的參數型別從 String 改成 StringBuilder。

    在實際呼叫時,StringBuilder 的參數必須先配置好足夠的記憶體(內存)空間,例如:

     

    StringBuilder desAddr = new StringBuilder(256);

    2007年4月16日 下午 02:45

所有回覆

  • 試試看把所有 OUT LPTSTR 對應的參數型別從 String 改成 StringBuilder。

    在實際呼叫時,StringBuilder 的參數必須先配置好足夠的記憶體(內存)空間,例如:

     

    StringBuilder desAddr = new StringBuilder(256);

    2007年4月16日 下午 02:45
  • C#中string預設是value type

    如果要傳入記憶體位置的話要用ref,至於out也是傳入記憶體位置,只是傳入參數本身不需要先做初始化,舉例來說, 如果參數是ref要傳入int的話, 一定要 int a = 10; aa(ref a); 這樣才行, out的話只要int a;就好了,初始化Method內會做

    所以你的問題 也需要看一下C++函數內的行為模式,不是看到有Out在C#這邊就要宣告

    2007年4月18日 上午 03:17