2013-05-09 3 views
3

У меня есть некоторые проблемы с передачей данных для импортированного ActiveX управления delphi в среде C#.Передача Delphi PChar на C#


У меня есть функция на стороне delphi, которая берет и возвращает PChar. Я могу изменить его или сделать с ним все, что захочу.

function TActiveFormX.DelphiFunction(S: PChar): PChar; 
begin 
    ///do something with 'S' 
    result:=S; 
end; 

А на C# стороне программы является функцией, которая вызывает функцию Дельфы, придавая ему строковый параметр, чтобы пережевать.

public void CSharpFunction() 
{ 
    string a = axActiveFormX1.DelphiFunction("sampleString"); 
} 

Я протестировал его, и, очевидно, все идет хорошо, пока C# не получит возвращенный PChar. Затем все приложение перестает отвечать и выходит. Я попытался реализовать блок try-catch, чтобы увидеть сообщение об исключении, но приложение просто сработает, прежде чем отображать что-либо.

Я полагаю, что он сбой из-за того, что переменные не были одного типа. Или из-за несоответствия версии жестокого программного обеспечения: Delphi 5 + Visual Studio 2012. Я искал это, но пока не повезло.

Любая помощь приветствуется :)

+1

Просьба показать декларацию о DelphiFunction на стороне C# –

+0

@ Давид Хеффернан, какую декларацию? Я новичок в деле Delphi-to-C# и не понимаю, о чем вы просите: D –

+0

Вы указали код, вызывающий эту функцию. Но должен быть некоторый C#, который объявляет эту функцию. –

ответ

1

Ваша функция Delphi не предназначена правильно для Interop. Если функция Delphi возвращает строку, вам необходимо согласиться использовать общую кучу, чтобы вызывающий мог выделить строку, и вызывающий может ее освободить.

Обычный способ справиться с этим - использовать COM BSTR, который обернут WideString в Delphi. Это использует общую кучу COM, чтобы вы могли выделить в одном модуле и освободить в другом.

Невозможно использовать WideString в качестве возвращаемого значения для взаимодействия, поскольку Delphi использует различные ABI из инструментов MS для возвращаемых значений. Это обсуждается более подробно здесь: Why can a WideString not be used as a function return value for interop?

Так вместо того, чтобы вы должны вернуть строку с помощью выходного параметра:

procedure Foo(const Input: WideString; out Output: WideString); 

Вашей C# типа библиотека будет иметь возможность импортировать, что правильно.

+0

Я сделаю снимок –

+0

Процедура не отображается в C#, даже когда она опубликована. –

+0

Помните, что вы не указали какие-либо сведения о том, как вы импортируете эту библиотеку Delphi в свой код C#. Поэтому я работаю в темноте. Я понятия не имею, был ли вы повторно импортирован компонент в C#. Продолжайте пытаться. Вы еще не указали информацию, которую я просил в комментарии. Измените вопрос, чтобы показать это. –