Solved

Help!!!  Multi-Platform DLL Integration with Delphi

Posted on 1997-06-13
3
542 Views
Last Modified: 2010-10-05
I work in a multi-platform development environment and NEED to be able to share functionality between:
      Delphi 2.0/3.0
      Clarion 2.0
      Visual Basic 4.0/5.0
      Visual FoxPro 5.0

Our development team has experts in each of these platforms.  We want to be able to share particular functions developed in one platform with the ALL ot the other platforms. Through the use of DLLs, we want to be able call a function, pass it parameters, have it act upon the parameters, and return a result, and potentially modify the input parameters.

This process sounds VERY simple in theory (every development platform's manuals make it sound soooo easy), but, in fact, we have had "limited successes".

I know that everyone has their "Favorite" platform, but has anyone successfully demonstrated that what I describe is possible.

ANY SAMPLE CODE/DLLS THAT DEMONSTRATES ANY OF THE ABOVE PLATFORMS WORKING TOGETHER WOULD GREATLY BE APPRECIATED.  Please include any instructions and specifics, such as compiler directive, additional support DLLS, yadayadaya...

I don't mean to be blunt, BUT!!!  If you have not actually been successful with what I have described above, please don't speculate.
0
Comment
Question by:jlm
  • 2
3 Comments
 

Expert Comment

by:kangadru
ID: 1337019
First of all, the DLL's need to be written in either Delphi or C/C++ using stdcall.  Next, you can NEVER use pascal strings as params in the calling conventions.  All strings must be passed as PCHAR, ByVal in VB.  PCHAR is roughly equal to CSTR or CHAR in C/C++.  Below you will find both the code for a Delphi DLL and the code for a corresponding VB call to it.  This is tested code, so if you have problems following it please feel free to ask.The same basic code is usable in Visual FoxPro.  I have never used Clarion, but I suspect that it's DLL calling conventions are very similarAndyDelphi DLL (kdExt.dll) - Preferably in the Windows System dir.library kdExt;

uses
  Forms,
  classes,
  dialogs,
  windows,
  registry,
  sysutils,
  uSplash in 'uSplash.pas' {frmSplash},
  uRegister in 'uRegister.pas' {frmRegister},
  uEnterpas in 'uEnterpas.pas' {frmRegEnter};

{$R *.RES}

var
  frmSplash   : TfrmSplash;
  frmRegister : TfrmRegister;

procedure ShowSplashScreen; stdcall; export;
  begin
    frmSplash := TfrmSplash.Create(Application);
    frmSplash.Show;
  end;

procedure FreeSplashScreen; stdcall; export;
  begin
    frmSplash.Free;
  end;

procedure SplashSetAction(szAction : pchar); stdcall; export;
  begin
    frmSplash.pnlAction.Caption := string(szAction);
  end;

function DisplayRegistration: integer;  stdcall; export;
  begin
    frmRegister := TfrmRegister.Create(Application);
    result := frmRegister.ShowModal;
    frmRegister.Free;
  end;

exports
  ShowSplashScreen,
  FreeSplashScreen,
  DisplayRegistration,
  SplashSetAction;

begin
  // hide the froms created in the DLL from the Task Bar
  IsLibrary := True;
  Application.CreateHandle;
  ShowWindow(Application.Handle, SW_HIDE);
  Application.ShowMainForm := FALSE;
end.VB Code - Module to define the DLL callsDeclare Sub ShowSplashScreen Lib "kdExt.dll" ()
Declare Sub SplashSetAction Lib "kdExt.dll" (ByVal action As String)
Declare Sub FreeSplashScreen Lib "kdExt.dll" ()


VB Code Calling the DLL Private Sub Command1_Click()
  ShowSplashScreen
  SplashSetAction ("Loading")
End Sub

Private Sub Command2_Click()
  FreeSplashScreen
End Sub
Andy
0
 
LVL 2

Accepted Solution

by:
icampbe1 earned 100 total points
ID: 1337020
I have done this in a similar environment.  First of all if you are working completely in a 32bit platform environment, its just a matter of calling conventions.  Thats no big deal for an experienced coder.  

If you must cross platform between 16 and 32 bit, don't bother trying thunking.  The more 'current' practice is to use COM.  It was developed for exactly what you want.  If you need to come up to speed on this, I would begin with a good understanding of OLE Automation  (NOT OLE Linking and Embeding).  You build the equivalent of DLLs but they contain COM objects which are all callable from EVERYONE!

Even the platform can be ignored because of the 'Marshalling' that takes place for the call.   If I understand your question correctly, this is the corrent answer.

Ian C.

0
 
LVL 2

Expert Comment

by:icampbe1
ID: 1337021
Thanks for grading me.  You might also want to keep in mind that there is a WM_CopyData windows message designed for inter-platform messages.  It automatically adjusts the handles and buff addresses to be correct across platforms.

Cheers,
Ian C.
0

Featured Post

How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

Join & Write a Comment

A lot of questions regard threads in Delphi.   One of the more specific questions is how to show progress of the thread.   Updating a progressbar from inside a thread is a mistake. A solution to this would be to send a synchronized message to the…
Hello everybody This Article will show you how to validate number with TEdit control, What's the TEdit control? TEdit is a standard Windows edit control on a form, it allows to user to write, read and copy/paste single line of text. Usua…
Access reports are powerful and flexible. Learn how to create a query and then a grouped report using the wizard. Modify the report design after the wizard is done to make it look better. There will be another video to explain how to put the final p…
You have products, that come in variants and want to set different prices for them? Watch this micro tutorial that describes how to configure prices for Magento super attributes. Assigning simple products to configurable: We assigned simple products…

708 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

16 Experts available now in Live!

Get 1:1 Help Now