Thanks.

That is very helpful.

I'll test it out tomorrow.

Do know if you call a method in the dll that stores data in global variables, that these are preserved. May need to allocate some memory to store the data but even then one must be able to maintain a pointer to it. I would like to be able to maintain some level of state between calls to the dll. I suppose I could just try this out but if you know that would be helpful.

Very much appreciated.
Peter.

On 15/12/2010 8:53 PM, Matt Siebert wrote:
Hi Peter,

I found the code for the demo app. Unfortunately its a little more basic than I remember.

On the Delphi side I have TestLib.dpr with...

library TestLib;

uses
  SysUtils,
  Classes,
  Windows;

{$R *.res}

function TestStringConverter(InputString : PChar; OutputString : PChar; BufSize : Integer) : Integer; stdcall;
var
  Input : String;
  Output : String;
  OutputLength : Integer;
begin
  Input := InputString;
  // Do something with the input string
  while Length(Output) < (BufSize - Length(Input)) do
  begin
    Output := Output + Input;
  end;
  // Write to output buffer
  StrPCopy(OutputString, Output);
  Result := Length(Output);
end;

exports
  TestStringConverter name 'TestStringConverter';

begin
end.

From memory, the key was using *PChar*'s and *stdcall*.

In .NET I had:

         [DllImport("TestLib.dll")]

         public  static  extern  int  TestStringConverter(string  
intput,StringBuilder  buffer,int  bufSize);

         void  Test()
         {
             StringBuilder  buffer =new  StringBuilder(20);

             int  result = TestStringConverter("Foo", buffer, buffer.Capacity);

             string  message =string.Format("Result = {0}\n\nBuffer:\n{1}", 
result, buffer.ToString());

             MessageBox.Show(message);
         }
In the production code we were passing a filename to the Delphi function, which would read the contents of the file, convert it (the bit we didn't have time to port to .NET) and then pass the converted contents back to the .NET app as a string. I think the first approach was to allocate the memory in Delphi and then copy the data in .NET but then we had to call another function in the Delphi library to cleanup (I can't remember the specifics). This worked ok but in the end I think we just used the above approach to allocate a buffer in .NET and pass it to the Delphi function. We were dealing with lots of small files so making the buffer large enough wasn't an issue, although we did have to check the return value to see if the buffer was too small (if so then make a bigger one and try again).

I hope this helps. Ping me off list if you'd like the full code for the demo app (not much more than what I've pasted above). Maybe some of the guys I used to work with might be willing to take a look at the code and offer some insight.

Cheers.

On Wed, Dec 15, 2010 at 7:30 PM, Peter Maddin <[email protected] <mailto:[email protected]>> wrote:

    I would very much appreciate a copy of your demo if you can locate it.
    Thanks for the offer.

    I was going to write up a limited dummy dll for proof of concept.
    If that did not work, try COM.

    I have a text "Delphi COM Programming" by Eric Harmon buts its
    pretty ancient (but then so is the Delphi code I am looking at)

    I have not had much exposure to COM. My only endeavour has been to
    write one using C# for use by Access VBA. That was a very simple
    hash function for passwords. It worked ok but I don't think they
    have ever used it.

    On 15/12/2010 5:03 PM, Matt Siebert wrote:
    Hi Peter,

    I found myself in a similar situation a while ago (wanting to
    pass strings between a Delphi DLL and .NET).

    There was something slightly tricky about strings but it wasn't
    too bad.  I think I did something with allocating memory which
    may be similar to your need to store the xml in memory on the
    Delphi side.

    Unfortunately I can't remember the details right now and I've
    since changed jobs.  I remember making a demo app in my spare
    time as a proof of concept before implementing it at work.  I'll
    have a look for the demo app tonight and let you know.

    Cheers,
    Matt.

    On Wed, Dec 15, 2010 at 4:00 PM, Peter Maddin
    <[email protected] <mailto:[email protected]>> wrote:

        I have some cipher units written for Delphi 7.
        These are fairly complex (at least for me). They contain
        methods (sorry functions and procedures) for the elliptic
        curve asymmetric cipher, The Rijndael symmetric cipher and
        the SHA-1 hash.

        The system that uses these is using file downloads  and
        uploads using Delphi 7 Isapi dlls.
        The system while working, is suffering congestion problems
        especially with uploads.

        What I would like to use is WCF web services to handle data
        downloads and create local server files from parameters sent
        to the WCF web service on the server rather than perform
        uploads (the file contents is very small).

        Writing the WCF should not be too much of a challenge but I
        need to use the delphi code to handle decryption/encryption.

        I thought of writing a Win32 dll for the encryption logic
        called from C# WinForms (or maybe WPF) application.

        Has anyone done this sort of thing before? I understand that
        value types are ok to exchange but reference types are a
        pain, this includes strings.

        I have googled and there is a fair bit out there. Most of
        this is dealing with the pain of trying do it.

        I only need to exchange ints, bools and strings. Nothing too
        fancy.
        Has anyone some sample code they would be willing to share?

        Also I would like be able call a method in the dll to store
        information in memory to be used by other method calls. This
        information is stored in an xml file and I would rather it be
        read and processed once rather than repeat this each time I
        need to use a method. In other words in using  delphi dll,
        will it preserve state between method calls?

        If I can't get the dll to work I will fall back on the
        crypographic support in the framework but this basically
        triples the effort required and data encrypted by the current
        system will not be compatible with the framework
        cryptographic routines.

        Any help very much appreciated.






Reply via email to