Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 02.10.2011
Сообщений: 4

Получить данные через указатель из dll на delphi

02.10.2011, 03:56. Показов 2645. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, помогите пожалуйста!
имеется dll, написанная на delphi, где есть процедура:
Delphi
1
procedure GGetCell(Col : integer; Row : integer; P : pointer) ; cdecl;
нужно получить данные по указателю P процедуры из этой dllки в c#
я делал так:
C#
1
2
3
4
5
6
7
8
class UseDll
{ 
    [DllImport("Gls.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "GGetCell", CharSet =      CharSet.Auto)]
    public static extern void GGetCell(int col, int row, byte[] buf);
}
    ...
byte[] buf = new byte[100];
UseDll.GGetCell(1, 1, buf);      //в buf лежит хрень
Второй вариант тоже самое:
C#
1
2
3
4
5
6
7
8
9
10
class UseDll
{ 
    [DllImport("Gls.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "GGetCell", CharSet =      CharSet.Auto)]
    public static extern void GGetCell(int col, int row, IntPtr ptr);
}
    ...
IntPtr prt = Marshal.AllocHGlobal(100);
byte[] buf = new byte[100];
UseDll.GGetCell(1, 1, prt);
Marshal.Copy(prt, buf, 0, 100);   //в buf лежит хрень
Написал аналогичную ф-ю в с++ и создал другую dll
C++
1
void GGetCell(int Col; int Row; void* P) ;
И здесь всё ок - данные корректные, а с dll delphi беда чёт(
Проблема в коде c# или же в етой dll на delphi?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.10.2011, 03:56
Ответы с готовыми решениями:

Как получить указатель на класс DLL через QLibrary ?
Чтоб можно было потом дёргать функции этого класса и юзать переменные, зная их имена...

Как получить через пространство имён "Reflection" данные (методы) из сборки (dll)?
Как получить через пространство имён "рефлекшн" данные(МЕТОДЫ) из сборки? Вот код Вставил ссылку на свой файл. Этот Длл просто...

Как получить адрес функции, возвращающей указатель на массив, из DLL?
В моем dll есть функция возвращающая указатель на массив указателей extern "C" _declspec(dllexport) float ** Calc(float...

4
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
02.10.2011, 12:17
bloom, dll на delphi выложите на форум.
0
0 / 0 / 0
Регистрация: 02.10.2011
Сообщений: 4
02.10.2011, 23:44  [ТС]
к сожалению dll не могу выложить, она принадлежит фирме, да и тогда кроме неё надо ещё другие файлы выкладывать чтоб всё запустить...
а вот её .pas файл без проблем)
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
unit Glsdll;
 
interface
 
uses
   RComType,
   RGls,
   LogLib_1,
   RGlsRp66;
 
var
   Gls :   TGlsRP66;
//конструктор
procedure CreateGls ; cdecl;
//деструктор
procedure DestroyGls ; cdecl;
//загрузить из файла
procedure GLoadFromFile(FileName : PChar); cdecl;
//получить информацию из ячейки
procedure GGetCell(Col : integer; Row : integer; P : pointer) ; cdecl;
 
 
implementation
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
procedure CreateGls ; cdecl;
begin
    Gls:=TGlsRP66.Create;
end;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
procedure DestroyGls ; cdecl;
begin
    Gls.Free;
end;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
procedure GLoadFromFile(FileName : PChar); cdecl;
   var
     s     : string;
begin
    s:=FileName;
    Gls.LoadFromFile(s);
end;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
procedure GGetCell(Col : integer; Row : integer; P : pointer) ; cdecl;
   var
     ColTip  : integer;
     S       : string;
     Real    : single;
     Int     : integer;
     Mnem    : TmnLis;
     MnemArr : TMnem32Rec;
     LenS    : integer;
 
 
begin
    ColTip:=Gls.colTip[Col];
    if ColTip=gtString then begin
       Gls.GetCell(Col,Row,S);
       LenS:=Length(S);
       Move(LenS,P^,4);
       incP(P,4);
       Move(S,P^,LenS);
    end;
    if ColTip=gtSingle then begin
       Gls.GetCell(Col,Row,Real);
       Move(Real,P^,4);
    end;
    if ColTip=gtInt then begin
       Gls.GetCell(Col,Row,Int);
       Move(Int,P^,4);
    end;
    if ColTip=gtMnem then begin
       Gls.GetCell(Col,Row,Mnem);
       Move(Mnem,P^,sizeOf(TmnLis));
    end;
    if ColTip=gtMnemArr then begin
       Gls.GetCell(Col,Row,MnemArr);
       Move(MnemArr,P^,sizeOf(TMnem32Rec));
    end;
end;
 
end.
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
03.10.2011, 03:06
Лучший ответ Сообщение было отмечено SatanaXIII как решение

Решение

bloom, а что Вы хотите увидеть в buf? Это байтовый массив, и кроме значений от 0 до 255 Вы ничего более не увидите, а судя по коду delphi, у Вас там минимальный тип данных занимает 4 байта, и помимо этого есть структуры (вроде, TMnem32Rec и TmnLis) которые занимают наверное и того больше, поэтому Вы и видите "хрень".
Полученный массив байт нужно преобразовать к необходимому типу, и тогда по идее Вы получите читабельные значения. Хотя если C dll нормально работает, и возвращаемая "хрень" нормально выглядит, то проблема в delphi dll.
Что-то более конкретно сказать сложно без dll, по коду всё верно. Только Marshal.FreeHGlobal вызывайте если будете использовать Marshal.AllocHGlobal.
0
0 / 0 / 0
Регистрация: 02.10.2011
Сообщений: 4
03.10.2011, 14:50  [ТС]
Спасибо, SSTREGG)
дело в том что я знаю какие значения байт должны быть в buf, т.е. например:
C#
1
2
3
4
5
6
7
UseDll.GGetCell(1, 1, buf);
возвращает       должно быть
buf[0] =160;     buf[0] = 76;
buf[1] = 41;     buf[1] = 69;
buf[2] = 25;     buf[2] = 84;
buf[3] =  6;     buf[3] = 69;
     ...
сег буду разбираться с разработчиком dll

Добавлено через 5 часов 25 минут
Так, оказалось что кривовата сама dll...тему можно закрывать)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.10.2011, 14:50
Помогаю со студенческими работами здесь

Как из dll получить указатель формы приложения и развернуть его из панели задач?
Всем доброго времени суток. Как из dll получить указатель формы приложения и развернуть его из панели задач? Собственно всё ясно. Код...

Как из dll получить указатель формы приложения и развернуть его из панели задач?
Доброго времени суток. Помогите, как из dll обратиться к приложению, из которого её запустили. А конкретно надо получить указатель на...

Как получить ссылку на указатель или указатель на указатель в массиве?
В процессе реализации сортировки пузырьком натолкнулся на такую проблему: как поменять значения указателей, передаваемых в функцию. Если...

Gdiplus::Bitmap - получить указатель на растровые данные в правильном порядке
Всем привет! Есть код работы с Gdiplus::Bitmap: unsigned int SizeCol,SizeRow; SizeCol = this->OriginalBitMap->GetWidth();...

Как из DLL на Delphi получить значения
Измучался! Понятно - не ас, хоть в VB.Net не первый день. Но уже двое суток бьюсь и никак! Помогите: Есть dll написанная в Delphi (с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru