Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работа c сишными dll в Delphi


Danila_master ©   (2007-02-23 15:29:00) 

Всем привет, подскажите, кто сможет где моя ошибка
Есть такая dll написанная на сях
#include <windows.h>

extern "C" _declspec( dllexport )float testValue(float* mas);

float testValue(float* mas)
{
   return mas[0];
}

И программка на дельфях
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs;

type
 TA = array of real;
 TForm1 = class(TForm)
 procedure FormShow(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

 function testValue(mas: TA): real; external 'CenterCalculation.dll';

var
 Form1: TForm1;

implementation

{$R *.dfm}
  procedure TForm1.FormShow(Sender: TObject);
  var
    s: TA;
  begin
    SetLength(s, 2);
    s[0] := 2.5;
    s[1] := 3.0;
    ShowMessage('Test - ' + FloatToStr (testValue(s)));
  end;
end.

Результат выдает вообще левый 7,984....
В чем ошибка? или из дельфи нельзя посылать динамические массивы?


Kostafey   (2007-02-24 02:05:00) [1]

> _declspec

Все верно она должна быть.


> Как я понимаю проблема в передаче динамического массива
> с делфи в библиотеку

Тоже верно.

Вообще когда у меня возникла проблема передачи массива из С++ dll в Delphi exe мне пришлось копировать его содержимое, а
не работать с укзателями, предоставленными из dll.
Решение некрасивое, но работало без сбоев.
Как мне кажется, таких вещей стоит избегать и передавать либо простые типы или хотя бы массивы фиксированной длины.

Наверное можно и по-другому...


Danila_master   (2007-02-23 16:32:00) [2]

Я точно не знаю, что значит _declspec, но эта форма была написана в книге.
С cdeclи stdcall пробовал, не помогает. Как я понимаю проблема в передаче динамического массива с делфи в библиотеку. Но в чем конкретно? Я не знаю. Хотя может я и не прав.


Ega23   (2007-02-23 16:13:00) [3]

Сначала скажи, что такое _declspec. Если не знаешь, попробуй добавить после real; или cdecl; или stdcall;

function testValue(mas: TA): real; cdecl;external 'CenterCalculation.dll';

или

function testValue(mas: TA): real; stdcall;external 'CenterCalculation.dll';


Наверх

Титульная страница Поиск, карта сайта Написать письмо