2013-03-04 2 views
3

Я использовал информацию в этом сообщении Delphi - Accessing data from dynamic array that is populated from an untyped Pointer и другие, а также Robert Giesecke's Unmanaged Exports, чтобы написать отличный код - спасибо всем. Например, я написал методы, которые возвращают сложный поток байтов из C# обратно в Delphi. У меня возникают проблемы, однако, простейшая вещь - возвращение целого числа из вызова функции.Возврат Int32 из управляемого кода в Delphi

Итак, я определяю этот прототип в Delphi:

TReturnIntFunc = function(AnInteger: Integer): Integer; safecall; 

и это в C#:

[DllExport("NegateInt", CallingConvention.StdCall)] 
[return: MarshalAs(UnmanagedType.I4)] 
static Int32 NegateInt([MarshalAs(UnmanagedType.I4)] Int32 AnInteger) 
{ 
    return AnInteger * -1; 
} 

Как и с другими методами, которые я написал, я динамически загрузить C# DLL, найти функция просто прекрасна, но когда я выполняю ее из Delphi, она выдает исключение с сообщением «Исключение в методе safecall».

Любые подсказки кому-нибудь? Я могу и иметь маршал обратно вне или ref целое число, а не как возвращаемое значение.

+0

Safecall список аргументов переписывается. Он изменяет количество аргументов вашей функции. Вот почему вы получаете ошибку времени выполнения. –

ответ

4

Safecall и StdCall - это не одно и то же - попробуйте использовать StdCall на стороне Delphi.

+0

Большое спасибо. Я просто ** знал, что я совершил ошибку новобранец, просто не мог этого видеть. Я не знаю, почему я использовал «safecall» в первую очередь. Он отлично работал для моих методов пустоты, а не «функций». Во всяком случае, я перестроил всех с stdcall с обеих сторон разрыва, и все это работает сейчас. –

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