将.NET 4.0与dll

时间:2015-11-05 09:15:18

标签: c# c++ pinvoke dllimport

c ++代码

MSIPC_SDK LONG __stdcall Ms_IpcClient_CaptureImage(LONG nUserId, char *sFilePath, 
    int nPathLen, const char *sDiskPath = NULL);//sDiskPath example: "C: \\".

影响:拍摄快照

参数备注:

  • LONG nUserId:Ms_Ipc_Login()//登录成功后返回值
  • char *sFilePath://保存录制文件的目的地
  • int nPathLen://路径的长度
  • const char *sDiskPath = NULL://要保存的磁盘

我的c#代码是:

[DllImport("MsIpcSDK", CharSet = CharSet.Ansi, 
    CallingConvention = CallingConvention.StdCall)]
public static extern int Ms_IpcClient_CaptureImage(
    int lUserID, 
    [MarshalAs(UnmanagedType.LPStr)]
    string sFilePath, 
    int nPathLen,
    [MarshalAs(UnmanagedType.LPStr)]
    string sDiskPath
);

并使用is方法:

var ret = Ms_IpcClient_CaptureImage(loginID, "C:\\a.bmp", 10000, "C:\\");

它在.Net Framework 2中工作,但在.Net Framework 4中不起作用。 如何在.Net Framework 4中修复它?

1 个答案:

答案 0 :(得分:0)

sFilePath用于将字符串从被调用者传递给调用者。这就是为什么类型是char*而不是const char*,这就是为什么有一个缓冲区长度参数的原因。这意味着您需要使用StringBuilder而不是string。 p / invoke应该是:

[DllImport("MsIpcSDK", CharSet = CharSet.Ansi, 
    CallingConvention = CallingConvention.StdCall)]
public static extern int Ms_IpcClient_CaptureImage(
    int lUserID, 
    StringBuilder sFilePath, 
    int nPathLen,
    string sDiskPath
);

呼叫应该是:

var filePath = new StringBuilder(260);
var ret = Ms_IpcClient_CaptureImage(loginID, filePath, filePath.Capacity, "C:\\");

你的代码一直都是错的,你到目前为止一直在逃避它。你传递一个缓冲长度值为10000的事实应该会让铃声响起!