Tek-Tips is the largest IT community on the Internet today!

Members share and learn making Tek-Tips Forums the best source of peer-reviewed technical information on the Internet!

  • Congratulations strongm on being selected by the Tek-Tips community for having the most helpful posts in the forums last week. Way to Go!

Delphi Dlls in C#

Status
Not open for further replies.

viper1777

Programmer
Dec 3, 2003
21
GB
Hi, I have a Delphi 6 DLL that I need to run from C#.Net 2.0. I have some problems with it though.

Here Goes:

The Delphi Decalration is :
Code:
function M_Login(ip : PChar; port : LongInt; uci : PChar; vol : PChar; pass : PChar; user : PChar) : LongInt; stdCall;
And the C# Declaration is :
Code:
[DllImport("iMSMAPI.DLL", CallingConvention = CallingConvention.StdCall, CharSet=CharSet.Ansi)]
        private static extern Int64 M_Login(string ip, Int64 port, string uci, string vol, string pass, string user);
This gives me an AccessViolationException at RunTime when I call M_Login.

I can Change the Delphi Declaration to expect Strings instead of PChars, this avoids the AccessViolationError, but this causes the values passed to the Delphi DLL to be incorrect. i.e. contain characters that the C# Application did not pass. I passed the value "127.0.0.1" as the ip parameter in C# and when I inspected the ip parameter in Delphi it was '1'#0'2'#0'7'#0'.'#0'0' .

Can anyone help.

Thanx!

Dave Shaw
Nothing is Impossible, it is just something I haven't got round to doing. - Me
History admires the wise, but elevates the brave. - Edmund Morris
 
.NET uses UTF-16 Unicode for it's strings. It looks like your Delphi code is expecting ASCII.

There may be a compiler option in Delphi to tell it to use Unicode, or you can use the Encoding class to get an instance of the ASCIIEncoder, and convert your string to a byte array.

Chip H.


____________________________________________________________________
Donate to Katrina relief:
If you want to get the best response to a question, please read FAQ222-2244 first
 
Cheer Chip,

I have now overcome this problem, however. I am now getting a BroadcastEventWindow.2.0.0.0.33 when I close my application. I am then getting RunTime Error 217 once then getting RunTime Error 216 followed by 'The Memory Could not be "Read"' message in a Continuous Loop until I Kill my Application.

Any Ideas?


Thanx!

Dave Shaw
Nothing is Impossible, it is just something I haven't got round to doing. - Me
History admires the wise, but elevates the brave. - Edmund Morris
 
Hi, I have fixed this also, nothing a good nights sleep can't cure. :)

The cause was that I was passing strings to the Delphi DLL, so I was using ShareMem Unit. But it was not the first unit in the Uses Declaration.

That will teach me for deleting the useful comments provided by Delphi. Doh! :)

Thanks.

Thanx!

Dave Shaw
Nothing is Impossible, it is just something I haven't got round to doing. - Me
History admires the wise, but elevates the brave. - Edmund Morris
 
Status
Not open for further replies.

Part and Inventory Search

Sponsor

Back
Top