![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа 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';