Hi Matt

Worked fine first time.



Thanks for the code.

I have Delphi 7 in  VM (XP Pro) but have managed to install Delphi 2007 (have Delphi 2009 but that uses Unicode and I expect that will cause me grief with legacy code this old). I have installed my three cipher controls in Delphi 2007 and then used Delphi 2007 to build your basic dll to be consumed by my elementary C# winforms app.  So far so good.

I really miss Resharper ( I am working at home).

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]> 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]> 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