Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обмен данными с dll (согласование типов) 
:(
    Опции темы
sammix
Дата 2.10.2005, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 1.10.2005

Репутация: нет
Всего: 2



Проблема в следующем:

есть dll написанная на дельфи. Экспортируемая функция должна возвращать массив строк.
Конкретно список файлов с удалённого сервера.
Возвращаемый результат должна принять программа написанная на C#

string дельфийский и сишарпа не работают : Object not set to an instance of an object

Может кто что-нибудь знает нащёт этого?
PM MAIL   Вверх
Дрон
Дата 2.10.2005, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 24
Всего: 93



Ну, а можно хотя бы объявление функций увидеть?

Хотя чует моё сердце, что дельфийский string напрямую в C# не передать.


--------------------
Да. Именно так.
PM   Вверх
sammix
Дата 2.10.2005, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 1.10.2005

Репутация: нет
Всего: 2



Вот пример:

длл на дельфи
Код

.....
function func1 : string; stdcall;
begin
 Result := "hello";
end;

exports
 func1;

end.


теперь кусок кода на шарпе
Код

[DllImport(@"C:\somedll.dll")]
private static extern string func1();

.....

private void test()
{
   string s = func1()
}


Тут-то вылетает эксепшн типа NullReference.
При чём если возвращать char или integer с длл"ки, то оно сработает.
А вот со string выпендрывается. Даже pchar пробовал -> толка мало.
PM MAIL   Вверх
nikf
Дата 3.10.2005, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 6.6.2005
Где: город-герой Жирно вск

Репутация: нет
Всего: 1



прога сделанная на C# с такой dll в жизни не сможет работать. Как впрочем и прога написанная на чем-нибудь другом кроме дельфи или билдера. Нормальная dll экспортирует только простые типы данных, а string - это класс, хотя разработчикам дельфи этого и не видно... Хочешь экспортировать классы - пиши и клиента и dll в одной среде разработки или делай COM или .NET dll.

Это сообщение отредактировал(а) nikf - 3.10.2005, 09:00
PM MAIL   Вверх
stab
Дата 3.10.2005, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 22
Всего: 48



Вот так работает:

Код

library Project1;

uses
  SysUtils,
  Classes;

{$R *.res}

function func1 : PChar; stdcall;
begin
 Result := 'hello';
end;

exports
 func1;

begin
end.


Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using System.Runtime.InteropServices;

namespace StringDllTest
{
    public partial class Form1: Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Text = Dll.func1();
        }
    }

    public class Dll
    {
        [DllImport(@"project1.dll")]
        public static extern string func1();
    }
}



--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
sammix
Дата 3.10.2005, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 1.10.2005

Репутация: нет
Всего: 2



Ну спасибо cully smile
Чёто я в прошлый раз не так сделал когда експортировал pchar.

Теперь всё работает.

Цитата
nikf: Хочешь экспортировать классы - пиши и клиента и dll в одной среде разработки или делай COM или .NET dll


Не пишу .net dll потому что не сложно ломать.
А так проект будет состоять из разных частей.
И кроме того я пока работу с сетью не изучил в сишарпе, потому штопаю на дельфи.

Это сообщение отредактировал(а) sammix - 3.10.2005, 19:51
PM MAIL   Вверх
nikf
Дата 4.10.2005, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 6.6.2005
Где: город-герой Жирно вск

Репутация: нет
Всего: 1



На самом деле есть подводные камни при работе с dll вот это
Цитата(cully @ 3.10.2005, 09:05)
function func1 : PChar; stdcall;
begin
Result := 'hello';
end;
exports
func1;

будет хорошо работать если делать буквально как написано, те возвращать указатели на константные строки, а если ты строки создаешь в dll динамически в результате каких-то операций - кто их будет удалять? Не думал почему все апи dll возвращающие строки (точнее массивы символов) запрашивают у клиента указатель на буфер под размещение этой строки и размер этого буфера? ну это так, к слову smile
PM MAIL   Вверх
mr.DUDA
Дата 4.10.2005, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(nikf @ 4.10.2005, 10:27)
а если ты строки создаешь в dll динамически в результате каких-то операций - кто их будет удалять?

Если ф-ция, запрашивающая строку, (пусть она будет написана на .NET) копирует эту строку в свою собственную string-переменную, для программера этой ф-ции самое главное чтобы на момент копирования ничего в буфере не менялось. А это легко обеспечить, если в рамках экспортируемой ф-ции func1 ничего не делать над буфером.


--------------------
user posted image
PM MAIL WWW   Вверх
nikf
Дата 4.10.2005, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 6.6.2005
Где: город-герой Жирно вск

Репутация: нет
Всего: 1



Цитата(mr @ 4.10.2005, 14:36)
А это легко обеспечить, если в рамках экспортируемой ф-ции func1 ничего не делать над буфером.
если возвращаемая строка объявлена локально в экспортируемой функции и не константа, то ничего делать и не надо чтобы получить недействительный указатель - он сам получится т.к. на момент копирования строка уже будет разрушена. А если ее создавать динамически из кучи (опять же локально) - то получишь утечку памяти - во о чем реч-то..

Это сообщение отредактировал(а) nikf - 4.10.2005, 14:48
PM MAIL   Вверх
mr.DUDA
Дата 4.10.2005, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(nikf @ 4.10.2005, 14:47)
если возвращаемая строка объявлена локально в экспортируемой функции и не константа, то ничего делать и не надо чтобы получить недействительный указатель - он сам получится т.к. на момент копирования строка уже будет разрушена. А если ее создавать динамически из кучи (опять же локально) - то получишь утечку памяти - во о чем реч-то..

В паскале все локальные переменные объявляются в рамках видимости ф-ции, т.е. пока ф-ция исполняется, переменные - живые. Другое дело, что с ними произойдёт при выходе из ф-ции, тут конечно nikf прав на 100%.


--------------------
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0529 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.