Привет
Описываю странную ситуацию:
Из Dll (unmanaged code) экспортится функция
bool __cdecl functioncall(const char *);
в C# она описана как
class Dllclass
{
[DllImport(DLLNAME, CallingConvention=CallingConvention.Cdecl)]
public static extern bool functioncall(string cfilename);
}
При следующем вызове
result = Dllclass.functioncall("12.txt");
получаем всегда true внезависимости от реального возвращаемого значения
Может все дело в том что ты фактически примаешь укзатель на unicod строку, а не char*, попробуй так заэкспортить
class Dllclass
{
[DllImport(DLLNAME, CallingConvention=CallingConvention.Cdecl)]
public static extern bool functioncall( [MarshalAs(LPStr)]string cfilename);
}
Здравствуйте, yanoscuni, Вы писали:
попробуй вместо bool указать, что реально возвращается 32-бит знаковое int
[DllImport(DLLNAME, CallingConvention=CallingConvention.Cdecl)]
public static extern int functioncall(string cfilename);
Здравствуйте, Ведмедь, Вы писали:
В>Может все дело в том что ты фактически примаешь укзатель на unicod строку, а не char*, попробуй так заэкспортить
В>В> class Dllclass
В> {
В> [DllImport(DLLNAME, CallingConvention=CallingConvention.Cdecl)]
В> public static extern bool functioncall( [MarshalAs(LPStr)]string cfilename);
В> }
В>
дело в том, что строка приходит правильно, а вот возвращаемое значение bool — нет. Может быть bool нужно маршалить специально?
Если я делаю
[DllImport(DLLNAME, CallingConvention=CallingConvention.Cdecl)]
[return : MarshalAs(UnmanagedType.I1)]
public static extern bool functioncall(string cfilename);
то тогда все работает. А default'ное приведение типов не работает. И, например
[return : MarshalAs(UnmanagedType.Bool)]
тоже. Это нормальная ситуация?
Здравствуйте, yanoscuni, Вы писали:
Y>Y> [DllImport(DLLNAME, CallingConvention=CallingConvention.Cdecl)]
Y> [return : MarshalAs(UnmanagedType.I1)]
Y> public static extern bool functioncall(string cfilename);
Y>
Y>то тогда все работает. А default'ное приведение типов не работает. И, например
Y>Y> [return : MarshalAs(UnmanagedType.Bool)]
Y>
Y>тоже. Это нормальная ситуация?
НОРМАЛЬНАЯ
Microsoft Specific
In Visual C++ 5.0 and later, bool is implemented as a built-in type with a size of 1 byte.
.Net Framework
UnmanagedType.Bool 4-byte (т.е. BOOL)