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中修复它?
答案 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
的事实应该会让铃声响起!