Solved

Delphi Dll in c#

Posted on 2004-04-22
10
3,616 Views
Last Modified: 2007-12-19
Hi,

I have a dll written in Delphi that I am trying to import into C#. But I get an exception each the program tries to access the dll. Here is my dll source code (in Delphi):

nit ActivationCodeMain;

interface
uses
  classes,
  sysutils,
  activation;

function getActivationCode(siteId: WideString; params: WideString; var ActivationCode: WideString): integer; stdcall;

implementation

function getActivationCode(siteId: WideString; params: WideString; var ActivationCode: WideString): integer; stdcall;
begin
  result := 0;
  ActivationCode := GenerateActivationCode(SiteId, 0);
  if (ActivationCode = '') then
  begin
    result := 1;
  end;
end;

end.

and here is my DllImport clause in C#:

[DllImport("ActivationCode.dll", CallingConvention=CallingConvention.StdCall)]
     public static extern System.Int32 getActivationCode(string a,string b,ref string c);

and I call this way:

string test = "";
System.Int32 n = getActivationCode("AAAAAAAAAA","BBBBBBBBB",ref test);

Does anybody have a solution?

Thanks.
0
Comment
Question by:dabitbol
10 Comments
 
LVL 8

Expert Comment

by:RomanPetrenko
ID: 10893785
1. Use StringBuilder class as third parameter in C#
2. Instead Int32 use IntPtr

Is it works now?
0
 
LVL 3

Author Comment

by:dabitbol
ID: 10893801
Would you mind giving an example please. I am not that familiar with StringBuilder
0
 
LVL 8

Expert Comment

by:RomanPetrenko
ID: 10893953
[DllImport("ActivationCode.dll", CallingConvention=CallingConvention.StdCall)]
public static extern IntPtr getActivationCode(string a,string b,System.Text.StringBuilder c);

and c.ToString() will give you an Activation Code string
0
 
LVL 8

Expert Comment

by:RomanPetrenko
ID: 10893961
Look here for "Call Unmanaged DLLs from C#"
http://msdn.microsoft.com/msdnmag/issues/02/08/CQA/
0
 
LVL 3

Author Comment

by:dabitbol
ID: 10894309
Thanks, But now I have a System.NullReferenceException with:

Additional information: Object reference not set to an instance of an object

Here is my C# Code:

[DllImport("ActivationCode.dll", EntryPoint="getActivationCode", CallingConvention=CallingConvention.StdCall)]
      public static extern System.IntPtr getActivationCode(string a,string b,StringBuilder c);

...

StringBuilder buffer = new StringBuilder("");
int i = 1;
i = getActivationCode("2058126983","",buffer).ToInt32(); <-- Error on this line
button1.Text = buffer.ToString();
...

And I know this function works, I tried the wrapper in Delphi.
0
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 
LVL 23

Expert Comment

by:rama_krishna580
ID: 10895376
0
 
LVL 14

Accepted Solution

by:
AvonWyss earned 500 total points
ID: 10897240
You are exporting an unicode function. Make sure to add the CharSet=CharSet.Unicode to the marshal attribute (just after CallingConvention).
0
 
LVL 3

Author Comment

by:dabitbol
ID: 10903441
Thanks Everybody for your help, it now works. I changed in my Delphi code widestrings to PChars and I use StringBuilder in .net
0
 

Expert Comment

by:erdosa
ID: 11115981
Hi

I want use dll (Delphi 7) in c#

example

delphi

procedure GetNev(s:PChar);export;
 begin
  ShowMessage(s)   ;
 end;
exports GetNev;


c#

[DllImport( "project1.dll", CallingConvention = CallingConvention.StdCall, CharSet=CharSet.Unicode )]
public static extern void GetNev(string s);

GetNev("hello");


problem:
  Message is: */-/_:?  (not "Hello")

what is tha problem???

Thenks Erdosa
0
 
LVL 3

Author Comment

by:dabitbol
ID: 11116999
You need first to write your call in delphi this way:

procedure GetNev(s:PChar);stdcall;
 begin
  ShowMessage(s)   ;
 end;

and call it this way in c#

[DllImport( "project1.dll", CallingConvention = CallingConvention.StdCall, CharSet=CharSet.Ansi )]
public static extern void GetNev(string s);


good luck
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Introduction Hi all and welcome to my first article on Experts Exchange. A while ago, someone asked me if i could do some tutorials on object oriented programming. I decided to do them on C#. Now you may ask me, why's that? Well, one of the re…
It was really hard time for me to get the understanding of Delegates in C#. I went through many websites and articles but I found them very clumsy. After going through those sites, I noted down the points in a easy way so here I am sharing that unde…
This Micro Tutorial will give you a basic overview how to record your screen with Microsoft Expression Encoder. This program is still free and open for the public to download. This will be demonstrated using Microsoft Expression Encoder 4.
Both in life and business – not all partnerships are created equal. As the demand for cloud services increases, so do the number of self-proclaimed cloud partners. Asking the right questions up front in the partnership, will enable both parties …

911 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

21 Experts available now in Live!

Get 1:1 Help Now