|
Использование 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?fid=20&msg=38030786&tid=1405688]: |
0ms |
get settings: |
12ms |
get forum list: |
15ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
94ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
61ms |
get tp. blocked users: |
2ms |
others: | 317ms |
total: | 526ms |
0 / 0 |