вызов unmanaged функций из C#
От: yanoscuni  
Дата: 11.03.03 15:23
Оценка:
Привет

Описываю странную ситуацию:

Из 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 внезависимости от реального возвращаемого значения
Re: вызов unmanaged функций из C#
От: Ведмедь Россия  
Дата: 11.03.03 15:29
Оценка:
Может все дело в том что ты фактически примаешь укзатель на unicod строку, а не char*, попробуй так заэкспортить
    class Dllclass
    {

          [DllImport(DLLNAME, CallingConvention=CallingConvention.Cdecl)]
          public static extern bool functioncall( [MarshalAs(LPStr)]string cfilename);
        }
Да пребудет с тобой Великий Джа
Re: вызов unmanaged функций из C#
От: Аноним  
Дата: 11.03.03 15:33
Оценка:
Здравствуйте, yanoscuni, Вы писали:

попробуй вместо bool указать, что реально возвращается 32-бит знаковое int

    [DllImport(DLLNAME, CallingConvention=CallingConvention.Cdecl)]
    public static extern int functioncall(string cfilename);
Re[2]: вызов unmanaged функций из C#
От: yanoscuni  
Дата: 11.03.03 15:41
Оценка:
Здравствуйте, Ведмедь, Вы писали:



В>Может все дело в том что ты фактически примаешь укзатель на 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)]


тоже. Это нормальная ситуация?
Re[3]: вызов unmanaged функций из C#
От: Ведмедь Россия  
Дата: 11.03.03 16:25
Оценка:
Здравствуйте, yanoscuni, Вы писали:


Y>тоже. Это нормальная ситуация?


Скорее всего по умолчанию bool маршалится в VARIANT_BOOL, от этого и все приключения.
Да пребудет с тобой Великий Джа
Re[3]: вызов unmanaged функций из C#
От: Аноним  
Дата: 11.03.03 16:44
Оценка:
Здравствуйте, 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)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.