Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Вызов функции из dll


Автор: Leonid1611 2.12.2008, 17:10
Здравствуйте возникла проблема с передачей структуры из 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.



При вызове выдается ошибка - не существует такой функции.

Автор: Alexeis 2.12.2008, 17:55
Цитата(Leonid1611 @  2.12.2008,  16:10 Найти цитируемый пост)

При вызове выдается ошибка - не существует такой функции. 

  Возможно дело в декорации имен функций С++. Неплохо бы глянуть какие реально имена функций в Dll.

Автор: Alix 2.12.2008, 19:16
Код библиотеки который Вы привели полный? А то там есть только getStructure, да и код DllMain не закончен - нет закрывающей скобки..

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)