Здравствуйте возникла проблема с передачей структуры из dll в функцию Delphi. stdafx.h
| Код | #include <windows.h> #define PARAMETERS_COUNT 3
typedef struct ScriptPar { char *name; char *description; int value; }; typedef struct ParamArray { struct ScriptPar mas[PARAMETERS_COUNT]; };
|
Testdll.c
| Код | // TestDll.cpp : Defines the entry point for the DLL application. //
#include "stdafx.h"
#ifdef _MANAGED #pragma managed(push, off) #endif
BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { return TRUE;
extern __declspec (dllexport) struct ScriptPar _stdcall getStructure() { static struct ScriptPar parameter; parameter.name = "par1"; parameter.description = "Parameter 1"; parameter.value = 1; return parameter; } #ifdef _MANAGED #pragma managed(pop) #endif
|
В Delphi:
| Код | unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TPointF = record //тип "координаты точки" x, y : single; //координаты end; TRectf = record //тип "координаты квадрата" a, b : TPointF; //координаты end; Tparamerets = record name : pchar; description : pchar; val : single; end; {Tparam = record mas : array[0..8] of Tparamerets; _rect : TRectf; _rectdef : TRectf; nameobj : pchar; end;} Tparam = record mas : ^Tparamerets; end; TForm1 = class(TForm) ScrollBox1 : TScrollBox; GroupBox1 : TGroupBox; GroupBox2 : TGroupBox; GroupBox3 : TGroupBox; Button1 : TButton; Button2 : TButton; ListBox1 : TListBox; ListBox2 : TListBox; procedure Button1Click(Sender: TObject); private public end;
function getParameters : Tparam; export; stdcall; external 'TestDll.dll' name 'getParameters'; function getStructure : Tparamerets; export; stdcall; external 'TestDll.dll' name 'getStructure';
var Form1 : TForm1; _param : Tparam;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); var i : integer; _p : Tparamerets; begin _param := getParameters; _p := getStructure;
{with _p do ListBox1.Items.Add(format('Параметр %d, имя %s, подсказка %s, значение %f', [i, name, description, val]));} //ListBox1.Items.Add(format('Колво параметров %d', [Length(_param.mas) - 1])); for i := 0 to 1 do begin with _param.mas^[i] do ListBox1.Items.Add(format('Параметр %d, имя %s, подсказка %s, значение %f', [i, name, description, val])); end; end;
end.
|
При вызове выдается ошибка - не существует такой функции. |