2015-11-05 4 views
0

Си ++ кодаНеизвестная ошибка при использовании .NET 4.0 с длл

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

Affect: Возьмите Snapshoot

Параметры Замечание:

  • LONG nUserId: Ms_Ipc_Login() // Возвращает значение после того, как 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 
); 

и использование является метод:

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

Он работает в .NET Framework 2, но не работает .Net Framework 4. Как его исправить. Net Framework 4?

+1

Определить «не работает». Что не работает? Вы получаете ошибку компиляции? Какая ошибка? –

+0

in .net 4 при использовании метода show перестали работать (проблема заставила программу перестать работать правильно) и закрыть программу –

+0

Пробовал ли вы отлаживать свою программу, чтобы увидеть, где именно она терпит неудачу? Вы убедились, что ваши параметры правильно переданы функции? Действительно ли LoginID действителен? вы пытались «@» C: \ a.tmp «' вместо '' C: \\ a.tmp "'? Вы пытались использовать 'CharSet = CharSet.Default'? – LightBulb

ответ

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, должно было установить звуковой сигнал звонка!

 Смежные вопросы

  • Нет связанных вопросов^_^