powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Использование DLL из Delphi в языке C#.
23 сообщений из 48, страница 2 из 2
Использование DLL из Delphi в языке C#.
    #36178780
crt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во первых, зачем тебе WideString из дельфи возвращать?

1) Если только из-за юникода то переделай свою дельфи-функцию в процедуру

что то типа

Код: plaintext
1.
2.
3.
4.
5.
procedure GetWideString(str:PWideChar);export:stdcall;
var ws:WideString
begin
 
 Move(ws[1],str^,Length(ws)*2);
end;

а в C# это будет

Код: plaintext
1.
2.
[DllImport(@"DelphiDLL.dll", CharSet = CharSet.Unicode)]
public static extern void GetWideString(StringBuilder s);

2) Если тебе именно BSTR надо возвращать, то и возвращай именно BSTR (в делфи это TBSTR)

что то типа

Код: plaintext
1.
2.
3.
4.
5.
function GetWideString:TBSTR;export:stdcall;
var ws:WideString
begin
 
 Result:=SysAllocString(@ws[1]);
end;

а в C# это будет
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
[DllImport("DelphiDLL.dll")]
static extern IntPtr GetWideString();

public static string GetWideStringEx()
{
    IntPtr result = GetWideString();
    try
    {
        return Marshal.PtrToStringBSTR(result);
    }
    finally
    {
        Marshal.FreeBSTR(result);
    }
}
...
Рейтинг: 0 / 0
Использование DLL из Delphi в языке C#.
    #36178790
crt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если первый вариант используешь то убедись что Capacity в StringBuilder достаточно для строки
...
Рейтинг: 0 / 0
Использование DLL из Delphi в языке C#.
    #36178804
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crtВо первых, зачем тебе WideString из дельфи возвращать?Чтобы не париться с Capacity в StringBuilder-е. :-)
...
Рейтинг: 0 / 0
Использование DLL из Delphi в языке C#.
    #36178850
crt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КcrtВо первых, зачем тебе WideString из дельфи возвращать?Чтобы не париться с Capacity в StringBuilder-е. :-)
ну да, в принципе первый вариант лишний, но для начинающего полезно знать что такой существует
...
Рейтинг: 0 / 0
Использование DLL из Delphi в языке C#.
    #36178879
кстати, а какого перца эта проблема вообще существует, там же (в дельфи) вроде задекларировано, что WideString совместима с BSTR?
--
а что делает Detach()? создает копию строки? дык это следствие того, что в сидибилдере пришлось использовать паскалевскую VCL, и, чтобы как-то это было совместимо, кропать многие системные типы дельфей (которые генерит компилер) в виде сиплюсплюсных классов... так шо, имхо, автор никакого Детача() в дельфи не увидит... могу ошибаться, конечно
...
Рейтинг: 0 / 0
Использование DLL из Delphi в языке C#.
    #36178910
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
снова дельфиа что делает Detach()? создает копию строки?Отсоединяет строку, чтобы она не умерла от деструктора объекта-обёртки.

снова дельфидык это следствие того, что в сидибилдере пришлось использовать паскалевскую VCL, и, чтобы как-то это было совместимо, кропать многие системные типы дельфей (которые генерит компилер) в виде сиплюсплюсных классов... так шо, имхо, автор никакого Детача() в дельфи не увидит... могу ошибаться, конечноЭто моё предположение, которое я порекомендовал проверить.
...
Рейтинг: 0 / 0
Использование DLL из Delphi в языке C#.
    #36178937
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
снова дельфикстати, а какого перца эта проблема вообще существует, там же (в дельфи) вроде задекларировано, что WideString совместима с BSTR?WideString сделан в первую очередь для использования в COM. А в COM не принято возвращать параметры "через заголовок функции". Возможно в делфи WideString в принципе не работает в таком режиме, и с ним нужно произвести дополнительные манипуляции.
...
Рейтинг: 0 / 0
Использование DLL из Delphi в языке C#.
    #36178968
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crtа в C# это будет
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
[DllImport("DelphiDLL.dll")]
static extern IntPtr GetWideString();

public static string GetWideStringEx()
{
    IntPtr result = GetWideString();
    try
    {
        return Marshal.PtrToStringBSTR(result);
    }
    finally
    {
        Marshal.FreeBSTR(result);
    }
}
По идее это аналог
Код: plaintext
1.
2.
[DllImport("DelphiDLL.dll")]
[return: MarshalAs(UnmanagedType.BStr)]
public static extern string GetWideString();
...
Рейтинг: 0 / 0
Использование DLL из Delphi в языке C#.
    #36178974
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Автор - не пачкай себе мозг, сделай на Дельфи нормальный COM класс, и пусть COM интероп сам разбирается с маршаллингом
...
Рейтинг: 0 / 0
Использование DLL из Delphi в языке C#.
    #36178984
crt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Кcrtа в C# это будет
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
[DllImport("DelphiDLL.dll")]
static extern IntPtr GetWideString();

public static string GetWideStringEx()
{
    IntPtr result = GetWideString();
    try
    {
        return Marshal.PtrToStringBSTR(result);
    }
    finally
    {
        Marshal.FreeBSTR(result);
    }
}
По идее это аналог
Код: plaintext
1.
2.
[DllImport("DelphiDLL.dll")]
[return: MarshalAs(UnmanagedType.BStr)]
public static extern string GetWideString();


возможно, я особо этим не пользовался.
Я просто предполагаю (и скорей всего это так ) что WideString != BSTR
А то что они в Дельфи совместимы так это просто потому что там компилятор, когда надо подсовывает то что нужно и нужные преобразования делает
...
Рейтинг: 0 / 0
Использование DLL из Delphi в языке C#.
    #36178992
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crtЯ просто предполагаю (и скорей всего это так ) что WideString != BSTRСкорее всего.
crtА то что они в Дельфи совместимы так это просто потому что там компилятор, когда надо подсовывает то что нужно и нужные преобразования делает И, скорее всего, в описываемом случае он ( компилятор делфи ) делает это неправильно.
...
Рейтинг: 0 / 0
Использование DLL из Delphi в языке C#.
    #36179008
НовичокВC#
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей К
И, скорее всего, в описываемом случае он (компилятор делфи) делает это неправильно.


Код: plaintext
1.
2.
 function  GetWideString1(): WideString; export; stdcall;
 procedure  GetWideString2( var  Result: WideString); export; stdcall;

Если DLL используется в программе Delphi, то работают оба варианта.
Если DLL используется в программе C#, то работает только вариант №2.

Судя по всему действительно ошибка компилятора при обработке первого варианта и всегда надо пользоваться вторым (чтобы DLL работала не только в Delphi, но и для других языков).
...
Рейтинг: 0 / 0
Использование DLL из Delphi в языке C#.
    #36179147
crt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КcrtЯ просто предполагаю (и скорей всего это так ) что WideString != BSTRСкорее всего.
crtА то что они в Дельфи совместимы так это просто потому что там компилятор, когда надо подсовывает то что нужно и нужные преобразования делает И, скорее всего, в описываемом случае он ( компилятор делфи ) делает это неправильно.
да он просто не знает что результат нужно в BSTR преобразовывать. Откуда он знает что ты эту ф-цию будешь из C# вызывать
...
Рейтинг: 0 / 0
Использование DLL из Delphi в языке C#.
    #36179358
НовичокВC#
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
crt
да он просто не знает что результат нужно в BSTR преобразовывать. Откуда он знает что ты эту ф-цию будешь из C# вызывать


А в этом случае знает?

Код: plaintext
1.
 procedure  GetWideString2( var  Result: WideString); export; stdcall;

Код: plaintext
1.
2.
[DllImport(@"DelphiDLL.dll", EntryPoint = "GetWideString2", CallingConvention = CallingConvention.StdCall)]
public static extern void GetWideString2([MarshalAs(UnmanagedType.BStr)] ref String Result);

Если бы WideString и BSTR были бы несовместимы, то и здесь была бы ошибка. А в этом случае всё работает правильно
...
Рейтинг: 0 / 0
Использование DLL из Delphi в языке C#.
    #36179369
Господа, кто там в дельфи колбасит - а проверьте дизассемблером - будет ли отличаться машинный код дельфийской функции, если заставить ее возвращать не WideString, а PWideChar?
...
Рейтинг: 0 / 0
Использование DLL из Delphi в языке C#.
    #36179504
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дельфи фтопкуГоспода, кто там в дельфи колбасит - а проверьте дизассемблером - будет ли отличаться машинный код дельфийской функции, если заставить ее возвращать не WideString, а PWideChar?

Интересно, какой либо из вариантов выделяет память под результат через SysAllocStringLen ?
...
Рейтинг: 0 / 0
Использование DLL из Delphi в языке C#.
    #36179845
midavik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помню была у меня такая ошибка со строка из длл-ки, но юзал ддл-ку из проги написанной на дельфях.
Меня спас модуль ShareMem подключаемый в приложении на дельфях.

{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }
...
Рейтинг: 0 / 0
Использование DLL из Delphi в языке C#.
    #36179887
мимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
midavik, это не касается WideStrings, эти строки аллоцирует и освобождает COMовский менеджер памяти
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Использование DLL из Delphi в языке C#.
    #37091884
VovaM44
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Специально зарегистрировался на форуме - когда через поисковик вышел на эту ветку.
Вышеозвученная проблема была решена следующим образом:

В Delphi пишем

function Название функции (): TBSTR; stdcall;
Var sItem: WideString;
begin
sItem := 'Peter Larsson';
Название функции := SysAllocStringLen(PWideChar(sItem), Length(sItem));
end;

В C#
[return: MarshalAs(UnmanagedType.BStr)]

пояснение взят отсюда
http://bytes.com/topic/c-sharp/answers/672441-problems-dllimport-delphi-native-dll
...
Рейтинг: 0 / 0
Использование DLL из Delphi в языке C#.
    #37091886
VovaM44
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VovaM44,
+
uses ActiveX в дельфях
...
Рейтинг: 0 / 0
Использование DLL из Delphi в языке C#.
    #37370446
Arafat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
to VovaM44
чувак! мегареспект тебе. 3 дня искал ответ.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Использование DLL из Delphi в языке C#.
    #38030786
OneHumansDay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В изложенном выше решение есть одна проблема: изменения дельфи кода. В условия использования сторонней библиотеки (CheckXml), увы, это невозможно.

В итоге было найдено решение: в C# тип метода сделать void, а в сигнатуру добавить out-параметр для результата:

Код: c#
1.
2.
 [DllImport(@"DelphiDLL.dll", EntryPoint = "GetWideString")]
  public static extern void GetWideString([MarshalAs(UnmanagedType.BStr)] out string result);



http://stackoverflow.com/questions/9349530/why-can-a-widestring-not-be-used-as-a-function-return-value-for-interop
...
Рейтинг: 0 / 0
Использование DLL из Delphi в языке C#.
    #38030798
VovaM44
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OneHumansDay,

круто, интересная идея
...
Рейтинг: 0 / 0
23 сообщений из 48, страница 2 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Использование DLL из Delphi в языке C#.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]