Solved

Delphi Dll in c#

Posted on 2004-04-22
10
3,627 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
Announcing the Most Valuable Experts of 2016

MVEs are more concerned with the satisfaction of those they help than with the considerable points they can earn. They are the types of people you feel privileged to call colleagues. Join us in honoring this amazing group of Experts.

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

Announcing the Most Valuable Experts of 2016

MVEs are more concerned with the satisfaction of those they help than with the considerable points they can earn. They are the types of people you feel privileged to call colleagues. Join us in honoring this amazing group of Experts.

Question has a verified solution.

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

Suggested Solutions

Article by: Ivo
C# And Nullable Types Since 2.0 C# has Nullable(T) Generic Structure. The idea behind is to allow value type objects to have null values just like reference types have. This concerns scenarios where not all data sources have values (like a databa…
Entity Framework is a powerful tool to help you interact with the DataBase but still doesn't help much when we have a Stored Procedure that returns more than one resultset. The solution takes some of out-of-the-box thinking; read on!
In this video I am going to show you how to back up and restore Office 365 mailboxes using CodeTwo Backup for Office 365. Learn more about the tool used in this video here: http://www.codetwo.com/backup-for-office-365/ (http://www.codetwo.com/ba…
This video shows how to quickly and easily add an email signature for all users on Exchange 2016. The resulting signature is applied on a server level by Exchange Online. The email signature template has been downloaded from: www.mail-signatures…

813 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

9 Experts available now in Live!

Get 1:1 Help Now