Здравствуйте, sergey2b, Вы писали:
S>Всем привет
S>Возможно я ошибся разделом но лучшего не нашел S>Я сишник и мне надо сделать интерфейс к своему коду из C#
S>Подскажите пожалуйста как под windows в C# S>задекларировать и вернуть void** из C кода
Привет,
Приведи сигнатуру C-ишной функции, с указанием соглашения о вызове (cdecl/stdcall и тп).
И поясни что ты с этим void** собираешься делать из C# кода, возможно никаких void** и не понадобится.
Здравствуйте, pilgrim_, Вы писали:
_>Здравствуйте, sergey2b, Вы писали:
S>>Всем привет
S>>Возможно я ошибся разделом но лучшего не нашел S>>Я сишник и мне надо сделать интерфейс к своему коду из C#
S>>Подскажите пожалуйста как под windows в C# S>>задекларировать и вернуть void** из C кода
_>Привет,
_>Приведи сигнатуру C-ишной функции, с указанием соглашения о вызове (cdecl/stdcall и тп). _>И поясни что ты с этим void** собираешься делать из C# кода, возможно никаких void** и не понадобится.
Здравствуйте, sergey2b, Вы писали:
S>>>Подскажите пожалуйста как под windows в C# S>>>задекларировать и вернуть void** из C кода
_>>Привет,
_>>Приведи сигнатуру C-ишной функции, с указанием соглашения о вызове (cdecl/stdcall и тп). _>>И поясни что ты с этим void** собираешься делать из C# кода, возможно никаких void** и не понадобится.
S>int open(const char* filename, void** hSrc)
Кхе, при такой скудной инфе можно так:
public static class Unsafe
{
[DllImport("mydll.dll", CharSet = CharSet.Ansi)]
public static extern int open(string filename, IntPtr hSrc);
}
Здравствуйте, pilgrim_, Вы писали:
_>Здравствуйте, sergey2b, Вы писали:
S>>>>Подскажите пожалуйста как под windows в C# S>>>>задекларировать и вернуть void** из C кода
_>>>Привет,
_>>>Приведи сигнатуру C-ишной функции, с указанием соглашения о вызове (cdecl/stdcall и тп). _>>>И поясни что ты с этим void** собираешься делать из C# кода, возможно никаких void** и не понадобится.
S>>int open(const char* filename, void** hSrc)
_>Кхе, при такой скудной инфе можно так:
_>
_>public static class Unsafe
_>{
_> [DllImport("mydll.dll", CharSet = CharSet.Ansi)]
_> public static extern int open(string filename, IntPtr hSrc);
_>}
_>
Надо добавить ref перед intptr
Но этотне сработает я уже пробовал перед тем как писать на форум
Сообщение об ошибки о несоответствии типов
Здравствуйте, sergey2b, Вы писали:
S>>>int open(const char* filename, void** hSrc)
_>>Кхе, при такой скудной инфе можно так:
_>>
_>>public static class Unsafe
_>>{
_>> [DllImport("mydll.dll", CharSet = CharSet.Ansi)]
_>> public static extern int open(string filename, IntPtr hSrc);
_>>}
_>>
S>Надо добавить ref перед intptr
Я же тебя cпросил, какое предполагаемое использование из С#, в общем случае никаких ref не надо, все что нужно средствами класса Marshal.Read/Write* ты можешь сделать с любым IntPtr (по сути void* как в C).
S>Но этотне сработает я уже пробовал перед тем как писать на форум S>Сообщение об ошибки о несоответствии типов
Извини, но в телепата играть не буду, давай нерабочий код, починим..
>какое предполагаемое использование из С#
Еще раз, какой характер твоего void**, это In/Out (вероятно) чего то непонятного (?), или строго типизированная структура, которую проще всего передавать/использовать средствами самого .NET (просто объявив нужную структуру на C#).
_>Еще раз, какой характер твоего void**, это In/Out (вероятно) чего то непонятного (?), или строго типизированная структура, которую проще всего передавать/использовать средствами самого .NET (просто объявив нужную структуру на C#).
спасибо за помощь
функция открывает файл и возращает указатель на структуру описывающую открытый файл,
есть десяток функций работы с этим файлом которые как ожидают этот указатель что бы знать с каим файлом проводить операцию
как запастной вариант я планировал возращать int номер индифицирующий номер структуры
Здравствуйте, sergey2b, Вы писали:
S>функция открывает файл и возращает указатель на структуру описывающую открытый файл, S>есть десяток функций работы с этим файлом которые как ожидают этот указатель что бы знать с каим файлом проводить операцию
Предполагается ли работа из C# с самой структурой (читать/изменять ее)?
Если нет, то гоняй туда/сюда просто IntPtr и все, те пусть для .NET это будет черный ящик.
S>как запастной вариант я планировал возращать int номер индифицирующий номер структуры
Тут не понял, но Сергей, лучше сразу описать in/out параметры детально, вне зависимости используемых ЯП, можешь обозвать их как P1, P2 если чего то опасаешься
Описать в смысле для читателей твоих постов, для адекватного ответа.
S>extern"C" __declspec(dllexport) int input_open( const char* filename, void** hSrc )
S> [DllImport("avlib.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
S> public static extern int input_open(string filename, ref IntPtr hSrc );
S>protected IntPtr hSrc = new IntPtr();
S>DLL.input_open(fileName, ref hSrc)
S>
Ну выглядит все норм, должно работать, ref лучше заменить на out, чтобы был четко ясен смысл параметра, но и с ref должно работать.
S>в момент выполнения эксепшен на второй параметр функции hSrc примерно звучащий как — неправильное преобразование типов
без минимального воспроизводимого примера сложно понять причину, по коду все норм.
Проверь на всякий случай соглашение о вызове в C-коде, хотя там скорее всего была бы другая ошибка.