|
Использование DLL из Delphi в языке C#.
|
|||
---|---|---|---|
#18+
Есть DLL, написанная на Delphi 7. Необходимо использовать её на языке C#. Определение на Delphi Код: plaintext 1.
Объявление в C#. Код: plaintext 1. 2.
Использование в C#. Код: plaintext 1.
В результате, возникает ошибка "Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена." На функциях, не передающих строки, ошибок не возникает. При использовании той же функции из той же DLL в Delphi ошибок не возникает. Следовательно, причина именно в передаче строк. Как правильно принять WideString, передаваемую DLL, написанной на Delphi? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2009, 11:37 |
|
Использование DLL из Delphi в языке C#.
|
|||
---|---|---|---|
#18+
Указать соответствующий атрибут MarshalAsAttribute результату импортируемого метода. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2009, 11:57 |
|
Использование DLL из Delphi в языке C#.
|
|||
---|---|---|---|
#18+
Вроде так Код: plaintext 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2009, 12:04 |
|
Использование DLL из Delphi в языке C#.
|
|||
---|---|---|---|
#18+
Алексей К Код: plaintext 1. 2. 3.
Та же самая ошибка. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2009, 12:13 |
|
Использование DLL из Delphi в языке C#.
|
|||
---|---|---|---|
#18+
Код метода на делфи? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2009, 12:19 |
|
Использование DLL из Delphi в языке C#.
|
|||
---|---|---|---|
#18+
И IDL этого метода. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2009, 12:20 |
|
Использование DLL из Delphi в языке C#.
|
|||
---|---|---|---|
#18+
Алексей КИ IDL этого метода.Гоню, какой нафиг IDL... ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2009, 12:21 |
|
Использование DLL из Delphi в языке C#.
|
|||
---|---|---|---|
#18+
Алексей К Код метода на делфи? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Алексей К И IDL этого метода. IDL нет. Я не использовал COM. В самой DLL: Код: plaintext 1. 2.
Например, при использовании в Delphi: Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2009, 12:47 |
|
Использование DLL из Delphi в языке C#.
|
|||
---|---|---|---|
#18+
stdcall ? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2009, 12:56 |
|
Использование DLL из Delphi в языке C#.
|
|||
---|---|---|---|
#18+
в дллимпорт задать параметр Char.Unicode пробовали? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2009, 12:57 |
|
Использование DLL из Delphi в языке C#.
|
|||
---|---|---|---|
#18+
Алексей К stdcall ? CharSet.Unicode в дллимпорт задать параметр Char.Unicode пробовали? Код: plaintext 1. 2. 3. 4.
Та же самая ошибка. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2009, 13:11 |
|
Использование DLL из Delphi в языке C#.
|
|||
---|---|---|---|
#18+
string на StringBuilder поменяй. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2009, 13:34 |
|
Использование DLL из Delphi в языке C#.
|
|||
---|---|---|---|
#18+
НовичокВC#Алексей Кstdcall ?Та же самая ошибка.Да я говорю в делфи stdcall методу указать. Там fastcall по умолчанию... Неужели никогда на делфи DLL для неделфи не писали... ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2009, 13:37 |
|
Использование DLL из Delphi в языке C#.
|
|||
---|---|---|---|
#18+
MCTSstring на StringBuilder поменяй.Не тот случай. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2009, 13:38 |
|
Использование DLL из Delphi в языке C#.
|
|||
---|---|---|---|
#18+
Алексей К Да я говорю в делфи stdcall методу указать. Там fastcall по умолчанию... Попробовал, результат не меняется ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2009, 14:21 |
|
Использование DLL из Delphi в языке C#.
|
|||
---|---|---|---|
#18+
Написал совсем простой пример, никак не связанный с конкретным приложением. Код: plaintext 1.
Код: plaintext 1. 2. 3. 4.
Код: plaintext 1. 2.
Код: plaintext 1. 2. 3.
Код: plaintext 1.
Та же самая ошибка. Причём, дело именно в передаче строк. Процедуры и функции, где все параметры целые числа, прекрасно работают. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2009, 16:30 |
|
Использование DLL из Delphi в языке C#.
|
|||
---|---|---|---|
#18+
Сделать на выходе из процедуры Дельфи PChar? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2009, 16:50 |
|
Использование DLL из Delphi в языке C#.
|
|||
---|---|---|---|
#18+
Попробуй заменить на Код: plaintext
будет ли ошибка? Если нет, с помощью Marshal разобраться, что все таки дельфи возвращает ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2009, 17:25 |
|
Использование DLL из Delphi в языке C#.
|
|||
---|---|---|---|
#18+
iks65 Попробуй заменить на Код: plaintext 1.
При наличии Код: plaintext 1.
код Код: plaintext 1.
даёт другую ошибку: "Невозможно упаковать "return value": Недопустимое сочетание управляемого и неуправляемого типов (Int/UInt должны составлять пару с SysInt или SysUInt)." При отсутствии Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2009, 17:46 |
|
Использование DLL из Delphi в языке C#.
|
|||
---|---|---|---|
#18+
Галочку в свойствах проекта Allow Unsafe code ставить пробовали? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2009, 22:02 |
|
Использование DLL из Delphi в языке C#.
|
|||
---|---|---|---|
#18+
MCTS string на StringBuilder поменяй. DATS Галочку в свойствах проекта Allow Unsafe code ставить пробовали? Не влияет на ошибку. Удалось локализовать ошибку. Ошибка возникает только тогда, когда function из Delphi возвращает WideString. Если function из Delphi возвращает целое число, то ошибок не возникает. Если возвращать WideString как var-параметр из процедуры, то ошибок не возникает. Поэтому заменил function из Delphi на procedure с var-параметром. Проблема решена. Но всё-таки интересно, как можно правильно принять WideString от функции Delphi в C#? Если кто приведет пример, то буду рад. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2009, 11:53 |
|
Использование DLL из Delphi в языке C#.
|
|||
---|---|---|---|
#18+
НовичокВC#Но всё-таки интересно, как можно правильно принять WideString от функции Delphi в C#? Если кто приведет пример, то буду рад.Попробуйте: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2009, 11:10 |
|
Использование DLL из Delphi в языке C#.
|
|||
---|---|---|---|
#18+
Алексей К Если заработает - значит в таком режиме неправильно работает дотнетный маршалер (или мы чего-то напутали, что скорее всего :-)). Если не заработает - значит проблема в делфи, а это в соседний форум. :-) Не заработало. Старая ошибка в строке Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2009, 12:27 |
|
Использование DLL из Delphi в языке C#.
|
|||
---|---|---|---|
#18+
НовичокВC#Не заработало.Значит проблема в делфи. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2009, 12:29 |
|
Использование DLL из Delphi в языке C#.
|
|||
---|---|---|---|
#18+
На "сибилдере" это выглядело бы вот так. Код: plaintext 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2009, 12:34 |
|
Использование DLL из Delphi в языке C#.
|
|||
---|---|---|---|
#18+
Во первых, зачем тебе WideString из дельфи возвращать? 1) Если только из-за юникода то переделай свою дельфи-функцию в процедуру что то типа Код: plaintext 1. 2. 3. 4. 5.
а в C# это будет Код: plaintext 1. 2.
2) Если тебе именно BSTR надо возвращать, то и возвращай именно BSTR (в делфи это TBSTR) что то типа Код: plaintext 1. 2. 3. 4. 5.
а в C# это будет Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2009, 12:55 |
|
Использование DLL из Delphi в языке C#.
|
|||
---|---|---|---|
#18+
если первый вариант используешь то убедись что Capacity в StringBuilder достаточно для строки ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2009, 12:57 |
|
Использование DLL из Delphi в языке C#.
|
|||
---|---|---|---|
#18+
crtВо первых, зачем тебе WideString из дельфи возвращать?Чтобы не париться с Capacity в StringBuilder-е. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2009, 12:59 |
|
Использование DLL из Delphi в языке C#.
|
|||
---|---|---|---|
#18+
Алексей КcrtВо первых, зачем тебе WideString из дельфи возвращать?Чтобы не париться с Capacity в StringBuilder-е. :-) ну да, в принципе первый вариант лишний, но для начинающего полезно знать что такой существует ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2009, 13:12 |
|
Использование DLL из Delphi в языке C#.
|
|||
---|---|---|---|
#18+
кстати, а какого перца эта проблема вообще существует, там же (в дельфи) вроде задекларировано, что WideString совместима с BSTR? -- а что делает Detach()? создает копию строки? дык это следствие того, что в сидибилдере пришлось использовать паскалевскую VCL, и, чтобы как-то это было совместимо, кропать многие системные типы дельфей (которые генерит компилер) в виде сиплюсплюсных классов... так шо, имхо, автор никакого Детача() в дельфи не увидит... могу ошибаться, конечно ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2009, 13:20 |
|
Использование DLL из Delphi в языке C#.
|
|||
---|---|---|---|
#18+
снова дельфиа что делает Detach()? создает копию строки?Отсоединяет строку, чтобы она не умерла от деструктора объекта-обёртки. снова дельфидык это следствие того, что в сидибилдере пришлось использовать паскалевскую VCL, и, чтобы как-то это было совместимо, кропать многие системные типы дельфей (которые генерит компилер) в виде сиплюсплюсных классов... так шо, имхо, автор никакого Детача() в дельфи не увидит... могу ошибаться, конечноЭто моё предположение, которое я порекомендовал проверить. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2009, 13:29 |
|
Использование DLL из Delphi в языке C#.
|
|||
---|---|---|---|
#18+
снова дельфикстати, а какого перца эта проблема вообще существует, там же (в дельфи) вроде задекларировано, что WideString совместима с BSTR?WideString сделан в первую очередь для использования в COM. А в COM не принято возвращать параметры "через заголовок функции". Возможно в делфи WideString в принципе не работает в таком режиме, и с ним нужно произвести дополнительные манипуляции. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2009, 13:38 |
|
Использование DLL из Delphi в языке C#.
|
|||
---|---|---|---|
#18+
crtа в C# это будет Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Код: plaintext 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2009, 13:45 |
|
Использование DLL из Delphi в языке C#.
|
|||
---|---|---|---|
#18+
Автор - не пачкай себе мозг, сделай на Дельфи нормальный COM класс, и пусть COM интероп сам разбирается с маршаллингом ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2009, 13:46 |
|
Использование DLL из Delphi в языке C#.
|
|||
---|---|---|---|
#18+
Алексей Кcrtа в C# это будет Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Код: plaintext 1. 2.
возможно, я особо этим не пользовался. Я просто предполагаю (и скорей всего это так ) что WideString != BSTR А то что они в Дельфи совместимы так это просто потому что там компилятор, когда надо подсовывает то что нужно и нужные преобразования делает ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2009, 13:51 |
|
Использование DLL из Delphi в языке C#.
|
|||
---|---|---|---|
#18+
crtЯ просто предполагаю (и скорей всего это так ) что WideString != BSTRСкорее всего. crtА то что они в Дельфи совместимы так это просто потому что там компилятор, когда надо подсовывает то что нужно и нужные преобразования делает И, скорее всего, в описываемом случае он ( компилятор делфи ) делает это неправильно. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2009, 13:55 |
|
Использование DLL из Delphi в языке C#.
|
|||
---|---|---|---|
#18+
Алексей К И, скорее всего, в описываемом случае он (компилятор делфи) делает это неправильно. Код: plaintext 1. 2.
Если DLL используется в программе Delphi, то работают оба варианта. Если DLL используется в программе C#, то работает только вариант №2. Судя по всему действительно ошибка компилятора при обработке первого варианта и всегда надо пользоваться вторым (чтобы DLL работала не только в Delphi, но и для других языков). ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2009, 13:59 |
|
Использование DLL из Delphi в языке C#.
|
|||
---|---|---|---|
#18+
Алексей КcrtЯ просто предполагаю (и скорей всего это так ) что WideString != BSTRСкорее всего. crtА то что они в Дельфи совместимы так это просто потому что там компилятор, когда надо подсовывает то что нужно и нужные преобразования делает И, скорее всего, в описываемом случае он ( компилятор делфи ) делает это неправильно. да он просто не знает что результат нужно в BSTR преобразовывать. Откуда он знает что ты эту ф-цию будешь из C# вызывать ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2009, 14:40 |
|
Использование DLL из Delphi в языке C#.
|
|||
---|---|---|---|
#18+
crt да он просто не знает что результат нужно в BSTR преобразовывать. Откуда он знает что ты эту ф-цию будешь из C# вызывать А в этом случае знает? Код: plaintext 1.
Код: plaintext 1. 2.
Если бы WideString и BSTR были бы несовместимы, то и здесь была бы ошибка. А в этом случае всё работает правильно ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2009, 15:45 |
|
Использование DLL из Delphi в языке C#.
|
|||
---|---|---|---|
#18+
Господа, кто там в дельфи колбасит - а проверьте дизассемблером - будет ли отличаться машинный код дельфийской функции, если заставить ее возвращать не WideString, а PWideChar? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2009, 15:51 |
|
Использование DLL из Delphi в языке C#.
|
|||
---|---|---|---|
#18+
дельфи фтопкуГоспода, кто там в дельфи колбасит - а проверьте дизассемблером - будет ли отличаться машинный код дельфийской функции, если заставить ее возвращать не WideString, а PWideChar? Интересно, какой либо из вариантов выделяет память под результат через SysAllocStringLen ? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2009, 16:43 |
|
Использование DLL из Delphi в языке C#.
|
|||
---|---|---|---|
#18+
Помню была у меня такая ошибка со строка из длл-ки, но юзал ддл-ку из проги написанной на дельфях. Меня спас модуль 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. } ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2009, 19:23 |
|
Использование DLL из Delphi в языке C#.
|
|||
---|---|---|---|
#18+
midavik, это не касается WideStrings, эти строки аллоцирует и освобождает COMовский менеджер памяти ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2009, 20:08 |
|
Использование DLL из Delphi в языке C#.
|
|||
---|---|---|---|
#18+
Специально зарегистрировался на форуме - когда через поисковик вышел на эту ветку. Вышеозвученная проблема была решена следующим образом: В 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 ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2011, 21:27 |
|
Использование DLL из Delphi в языке C#.
|
|||
---|---|---|---|
#18+
VovaM44, + uses ActiveX в дельфях ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2011, 21:28 |
|
Использование DLL из Delphi в языке C#.
|
|||
---|---|---|---|
#18+
to VovaM44 чувак! мегареспект тебе. 3 дня искал ответ. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2011, 11:10 |
|
Использование DLL из Delphi в языке C#.
|
|||
---|---|---|---|
#18+
В изложенном выше решение есть одна проблема: изменения дельфи кода. В условия использования сторонней библиотеки (CheckXml), увы, это невозможно. В итоге было найдено решение: в C# тип метода сделать void, а в сигнатуру добавить out-параметр для результата: Код: c# 1. 2.
http://stackoverflow.com/questions/9349530/why-can-a-widestring-not-be-used-as-a-function-return-value-for-interop ... |
|||
:
Нравится:
Не нравится:
|
|||
08.11.2012, 17:52 |
|
|
start [/forum/topic.php?all=1&fid=20&tid=1405688]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
40ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
84ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 185ms |
0 / 0 |