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

Определение на Delphi

Код: plaintext
1.
   function  GetWideString(): WideString; export;

Объявление в C#.

Код: plaintext
1.
2.
  [DllImport(@"DelphiDLL.dll", EntryPoint = "GetWideString")]
  public static extern string GetWideString();

Использование в C#.

Код: plaintext
1.
  string MyString = GetWideString();

В результате, возникает ошибка "Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена."

На функциях, не передающих строки, ошибок не возникает. При использовании той же функции из той же DLL в Delphi ошибок не возникает. Следовательно, причина именно в передаче строк.

Как правильно принять WideString, передаваемую DLL, написанной на Delphi?
...
Рейтинг: 0 / 0
Использование DLL из Delphi в языке C#.
    #36174323
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Указать соответствующий атрибут MarshalAsAttribute результату импортируемого метода.
...
Рейтинг: 0 / 0
Использование DLL из Delphi в языке C#.
    #36174349
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде так
Код: plaintext
1.
2.
[DllImport("DelphiDLL.dll")]
[return: MarshalAs(UnmanagedType.BStr)]
public static extern string GetWideString();
...
Рейтинг: 0 / 0
Использование DLL из Delphi в языке C#.
    #36174374
НовичокВC#
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей К
Код: plaintext
1.
2.
3.
[DllImport("DelphiDLL.dll")]
[return: MarshalAs(UnmanagedType.BStr)]
public static extern string GetWideString();


Та же самая ошибка.
...
Рейтинг: 0 / 0
Использование DLL из Delphi в языке C#.
    #36174394
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код метода на делфи?
...
Рейтинг: 0 / 0
Использование DLL из Delphi в языке C#.
    #36174396
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И IDL этого метода.
...
Рейтинг: 0 / 0
Использование DLL из Delphi в языке C#.
    #36174397
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КИ IDL этого метода.Гоню, какой нафиг IDL...
...
Рейтинг: 0 / 0
Использование DLL из Delphi в языке C#.
    #36174473
НовичокВC#
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей К
Код метода на делфи?


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 // код функции 
 function  GetWideString(): WideString;
 begin 
   // Вызов формы через ShowModal. Пользователь работает с формой, вызывая другие формы. 
   // Поведение не отличается от использования в Delphi-приложениях. 
   // В результате работы на компоненте отображается правильная строка. 
   // Данные с компонента переносятся в глобальную переменную GeneratedString. 

  Result := OuterModule.GeneratedString;
 end ;

 // объявление переменной 
  GeneratedString: WideString;

Алексей К
И IDL этого метода.


IDL нет. Я не использовал COM. В самой DLL:

Код: plaintext
1.
2.
 exports 
  GetWideString;

Например, при использовании в Delphi:

Код: plaintext
1.
 function  GetWideString(): WideString; external 'DelphiDLL.dll';
...
Рейтинг: 0 / 0
Использование DLL из Delphi в языке C#.
    #36174494
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stdcall ?
...
Рейтинг: 0 / 0
Использование DLL из Delphi в языке C#.
    #36174500
CharSet.Unicode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в дллимпорт задать параметр Char.Unicode пробовали?
...
Рейтинг: 0 / 0
Использование DLL из Delphi в языке C#.
    #36174558
НовичокВC#
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей К
stdcall ?


CharSet.Unicode
в дллимпорт задать параметр Char.Unicode пробовали?


Код: plaintext
1.
2.
3.
4.
  [DllImport(@"atvdll.dll", EntryPoint = "GetWideString", CallingConvention = CallingConvention.StdCall, 
    CharSet = CharSet.Unicode)]
  [return: MarshalAs(UnmanagedType.BStr)]
  public static extern string GetWideString();

Та же самая ошибка.
...
Рейтинг: 0 / 0
Использование DLL из Delphi в языке C#.
    #36174621
MCTS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
string на StringBuilder поменяй.
...
Рейтинг: 0 / 0
Использование DLL из Delphi в языке C#.
    #36174629
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НовичокВC#Алексей Кstdcall ?Та же самая ошибка.Да я говорю в делфи stdcall методу указать. Там fastcall по умолчанию... Неужели никогда на делфи DLL для неделфи не писали...
...
Рейтинг: 0 / 0
Использование DLL из Delphi в языке C#.
    #36174630
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MCTSstring на StringBuilder поменяй.Не тот случай.
...
Рейтинг: 0 / 0
Использование DLL из Delphi в языке C#.
    #36174756
НовичокВC#
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей К
Да я говорю в делфи stdcall методу указать. Там fastcall по умолчанию...


Попробовал, результат не меняется
...
Рейтинг: 0 / 0
Использование DLL из Delphi в языке C#.
    #36175116
НовичокВC#
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Написал совсем простой пример, никак не связанный с конкретным приложением.

Код: plaintext
1.
 function  TestFunction(): WideString; export; stdcall;

Код: plaintext
1.
2.
3.
4.
 function  TestFunction(): WideString; stdcall;
 begin 
  Result := 'AAA';
 end ;

Код: plaintext
1.
2.
 exports 
  TestFunction;

Код: plaintext
1.
2.
3.
  [DllImport(@"DelphiDLL.dll", EntryPoint = "TestFunction", CallingConvention = CallingConvention.StdCall)]
  [return: MarshalAs(UnmanagedType.BStr)]
  public static extern string TestFunction();

Код: plaintext
1.
  string StValue = TestFunction();

Та же самая ошибка. Причём, дело именно в передаче строк. Процедуры и функции, где все параметры целые числа, прекрасно работают.
...
Рейтинг: 0 / 0
Использование DLL из Delphi в языке C#.
    #36175173
morph13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделать на выходе из процедуры Дельфи PChar?
...
Рейтинг: 0 / 0
Использование DLL из Delphi в языке C#.
    #36175255
iks65
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробуй заменить на

Код: plaintext
public static extern IntPtr GetWideString();

будет ли ошибка? Если нет, с помощью Marshal разобраться, что все таки дельфи возвращает
...
Рейтинг: 0 / 0
Использование DLL из Delphi в языке C#.
    #36175336
НовичокВC#
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iks65
Попробуй заменить на
Код: plaintext
1.
public static extern IntPtr GetWideString();
будет ли ошибка? Если нет, с помощью Marshal разобраться, что все таки дельфи возвращает


При наличии
Код: plaintext
1.
[return: MarshalAs(UnmanagedType.BStr)]

код

Код: plaintext
1.
IntPtr MyString = GetWideString();

даёт другую ошибку:

"Невозможно упаковать "return value": Недопустимое сочетание управляемого и неуправляемого типов (Int/UInt должны составлять пару с SysInt или SysUInt)."

При отсутствии
Код: plaintext
1.
[return: MarshalAs(UnmanagedType.BStr)]
старая ошибка.
...
Рейтинг: 0 / 0
Использование DLL из Delphi в языке C#.
    #36175735
Dats
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Галочку в свойствах проекта Allow Unsafe code ставить пробовали?
...
Рейтинг: 0 / 0
Использование DLL из Delphi в языке C#.
    #36176396
НовичокВC#
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MCTS
string на StringBuilder поменяй.


DATS
Галочку в свойствах проекта Allow Unsafe code ставить пробовали?


Не влияет на ошибку.

Удалось локализовать ошибку. Ошибка возникает только тогда, когда function из Delphi возвращает WideString. Если function из Delphi возвращает целое число, то ошибок не возникает. Если возвращать WideString как var-параметр из процедуры, то ошибок не возникает. Поэтому заменил function из Delphi на procedure с var-параметром. Проблема решена.

Но всё-таки интересно, как можно правильно принять WideString от функции Delphi в C#? Если кто приведет пример, то буду рад.
...
Рейтинг: 0 / 0
Использование DLL из Delphi в языке C#.
    #36178466
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НовичокВC#Но всё-таки интересно, как можно правильно принять WideString от функции Delphi в 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#.
    #36178711
НовичокВC#
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей К
Если заработает - значит в таком режиме неправильно работает дотнетный маршалер (или мы чего-то напутали, что скорее всего :-)). Если не заработает - значит проблема в делфи, а это в соседний форум. :-)


Не заработало. Старая ошибка в строке

Код: plaintext
1.
IntPtr result = GetWideString();
...
Рейтинг: 0 / 0
Использование DLL из Delphi в языке C#.
    #36178717
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НовичокВC#Не заработало.Значит проблема в делфи.
...
Рейтинг: 0 / 0
Использование DLL из Delphi в языке C#.
    #36178732
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На "сибилдере" это выглядело бы вот так.
Код: plaintext
1.
2.
3.
4.
BSTR MyFunction()
{
     WideString result = "бла бла бла";
     return result.Detach();
}
Проверьте, выполняется ли в делфи операция, аналогичная вызову метода Detach.
...
Рейтинг: 0 / 0
25 сообщений из 48, страница 1 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Использование DLL из Delphi в языке C#.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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