Jump to content

David Heffernan

Members
  • Content Count

    3710
  • Joined

  • Last visited

  • Days Won

    185

Posts posted by David Heffernan


  1. 31 minutes ago, A.M. Hoornweg said:

    The default calling convention in Delphi is "register" (the compiler tries to pass parameters in registers if possible to speed things up). 

     

    The "Stdcall" convention is used throughout by the 32-bit Windows API (which consists of DLL's).  So, for consistency's sake, it makes sense to adopt that calling convention for your own 32-bit DLL's as well. "Stdcall" tells the compiler that the caller of the function will pass all parameters on the stack in a right-to-left sequence and that the function itself is responsible for cleaning up the stack before returning.

     

    As Remy Lebeau pointed out, in 64-bit Windows there's only one calling convention. So you could do something like this:

     

    //in the DLL:

    Procedure MyProc; {$ifdef win32} Stdcall;{$endif} Export;

    begin

    ..

    end;

    ... exports 'MyProc';

     

     

    //In the exe:

    Procedure MyProc; {$ifdef win32} Stdcall;{$endif} external 'mydll.dll';

     

     

     

     

     

     

     

    As discussed above the conditional code simply adds clutter for no benefit. The compiler has already handled the issue for you. Remove the conditional, and let the compiler ignore stdcall in x64.

     

    A second point is the use of the export directive. It is also always ignored (a hangover from 16 bit days). Again it should be removed.  Therefore the best practise would be to write:

     

    procedure MyProc; stdcall;

    And that's it.  Obviously you still need the exports list somewhere.

    • Like 2

  2. 1 hour ago, David Schwartz said:

    As if that has never happened with anything Microsoft ever published ...

    Spend some time looking at the development process and quality over in C# and .net land, and then see if you honestly can regard Emba's process and quality even remotely in the same ball park. 

    • Like 2

  3. 1 hour ago, Georgge Bakh said:

    David, if I got you right, your advice is to use the technique with virtual methods because it works. It's a good advice thank you.

    But I wanted to use generics as it's a powerful technique which I successfully use in other languages and it seems it should work for my case. And a broad range of other cases which can be identified as parametrization by code.

    If it can't be done in Delphi it's sad but I'd want to know why. Is it a bug?

    Let's get on with it:

    I have TTest<TTest2> specialization of the above generic class TTest. May I expect that field FTest will have static type TTest2? If no why?

    It's not a choice between either generics, or polymorphism. You can use both.


  4. 7 minutes ago, Georgge Bakh said:

    Why?

    Because that's the only way to make this work.

     

    Your expectations seem unrealistic.  As I see it you face two choices:

    1. Code it the way I said, and thus have your code work the way you want.

    2. Code it your way, and have your code not work the way you want.

     

    I don't understand why you want to take option 2.

×