I created a new C ++ DLL project in VS2010 that provides 1 function
#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 ; }
Then I created a C ++ application with VS2010 to test this DLL. Building a test application in VS2010 can call the C ++ DLL and get the expected result.
#include "stdafx.h" #include <windows.h> 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; }
Then I tried to build a new project in Delphi 7 to call this C ++ DLL. I used this tutorial to help me build a new project.
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.
The Delphi 7 project result is 6155731. When I was expecting 5. I checked the binary result code, thinking that it might have something to do with the data type, but it looks random to me. When I recompile / restart the application, it gets the same result every time.
I donβt know much about Delphi, this is the first time I do this and I find it confusing.
Any suggestion on what to check next?