Вызов функций из C++ DLL в Delphi

Я создал новый проект DLL c++ в VS2010, который предоставляет 1 функцию

#include "stdafx.h"    
#define DllImport   extern "C" __declspec( dllimport )
#define DllExport   extern "C" __declspec( dllexport )    
DllExport int DoMath( int a, int b) {
    return a + b ; 
}

Затем я создал приложение C++ с VS2010 для тестирования этой библиотеки DLL. Сборка тестового приложения в VS2010 могла вызвать DLL c++ и получить ожидаемый результат.

#include "stdafx.h"
#include 

typedef int (*DoMath)(int, int) ; 
int _tmain(int argc, _TCHAR* argv[])
{
    HMODULE hMod = LoadLibrary ("exampleDLL.dll");
    if (NULL != hMod) {
        DoMath mf1 = (DoMath) GetProcAddress(hMod,"DoMath");
        if( mf1 != NULL ) {
            printf ("DoMath(8,7)==%d \n", mf1(8,7) );   
        } else {
            printf ("GetProcAddress Failed \n");
        }
        FreeLibrary(hMod);
    } else { 
        printf ("LoadLibrary failed\n");
        return 1;
    }
    return 0;
}

Затем я попытался построить новый проект в Delphi 7, чтобы вызвать эту C++ DLL. Я использовал этот учебник , чтобы помочь мне создать новый проект.

unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TmyFunction = function(X,Y: Integer):Integer;

  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    procedure FormShow(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    hDll: THandle;
  end;

var
  Form1: TForm1;
  fDoMath : TmyFunction;

implementation
{$R *.dfm}

procedure TForm1.FormShow(Sender: TObject);
begin
  hDll := LoadLibrary('exampleDLL.dll');
   if HDll >= 32 then { success }
   begin
     fDoMath := GetProcAddress(hDll, 'DoMath');
   end
   else
     MessageDlg('Error: could not find exampleDLL.DLL', mtError, [mbOk], 0)
end;

procedure TForm1.Button1Click(Sender: TObject);
 var i: Integer;
begin
 i := fDoMath(2,3);
 edit1.Text := IntToStr(i);
end;
end.

Результат проекта Delphi 7: 6155731 Когда я ожидал 5 .Я проверил двоичный код результата, думая, что он может иметь какое-то отношение к типу данных, но мне он кажется случайным. Когда я перекомпилирую/перезапускаю приложение, оно каждый раз получает один и тот же результат.

Я мало что знаю о Delphi, это первый раз, когда я имею дело с ним, и я нахожу его запутанным.

Есть предложения, что проверить дальше?

12
задан Steven smethurst 1 May 2012 в 23:58
поделиться