title: Calling functions from a c++ DLL in Delphi
body: <p>I created a new c++ DLL project in VS2010 that exposes 1 function </p>
  
  <pre><code>#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 ; 
  }
  </code></pre>
  
  <p>I then created a C++ application with VS2010 to test this DLL. The test application build in VS2010 could call the c++ DLL and get the expected result. </p>
  
  <pre><code>#include "stdafx.h"
  #include &lt;windows.h&gt;
  
  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;
  }
  </code></pre>
  
  <p>Next I attempted to build a new project in Delphi 7 to call this C++ DLL. I used <a href="http://www.drbob42.com/delphi/headconv.htm" rel="noreferrer">this tutorial</a> to help me build the new project. </p>
  
  <pre><code>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 &gt;= 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.
  </code></pre>
  
  <p>The result from the Delphi 7 project is <em>6155731</em> When I expected <em>5</em>. I checked the binary of the result thinking it might have something to do with a data type but it looks random to me. When I recompile/rerun the application it gets the same result every time. </p>
  
  <p>I do not know a lot about Delphi this is the first time I have deal with it and i find it confusing. </p>
  
  <p>Any suggestion on what to check next?</p>