C # dll вызов не передает char * в C ++ MFC обычную dll - PullRequest
0 голосов
/ 11 августа 2011

У меня есть обычная DLL-библиотека C ++ MFC, которую я вызываю со следующими данными:

public static class Access3rdPartyDLL
{
  public static string FilePath;
  [DllImport("3rdparty.dll")]  
  // I have also tried LPWStr
  public static extern long Download([MarshalAs(UnmanagedType.LPStr)]string sDownloadFile,
                                   int iDeviceNum
                                   ...);

  public static long DownloadToDevice()
  {
    long result;
    string FilePath = "C:\\myfile.txt"
    result = Download(FilePath, 1, ...);
    // check if success or error
    if(result > 0)
    ...
  }
}

Я получаю сообщение об ошибке из DLL, в котором говорится: «Файл:« C: \ myfile.txt »не найден. Но его нет ...
Я также пытался использовать StringBuilder, но это также не удается.

Может ли это быть проблемой с DLL или я что-то не так делаю?
Я нашел этот текущий код здесь: SO: эквивалентный символ * в C #

РЕДАКТИРОВАТЬ: я делал это в C ++ раньше, и этот код работает:

extern "C" __declspec(dllimport) HRESULT __stdcall Download(char* sDownloadFile, int ...  

с которым я звоню:

HRESULT result = Download(file_for_download, 1, .. // where file_for_download is a char*

Ответы [ 2 ]

0 голосов
/ 11 августа 2011

Единственное, что не так с вызовом P / - это то, что вы используете C # long, который равен 64 битам, а HRESULT - только 32 бита.

У вас совпадают соглашения о вызовах, маршаллинг по умолчаниюдля управляемого string на неуправляемой стороне - char*.

Несоответствие размера возвращаемого значения не объясняет, почему ваш код C # получает строковое сообщение File: 'C:\myfile.txt' not found, поэтому ваша основная проблема, скорее всего, заключается в коде, который выне показали нам.

0 голосов
/ 11 августа 2011

Я не вижу причин, по которым следующее не будет работать в этом простом сценарии:

[DllImport( "3rdparty.dll", CharSet = CharSet.Ansi )]
static extern long Download(string sDownloadFile, int iDeviceNum, ...)

long result = Download("C:\\myfile.txt", 1, ...);
...