Solved

Delphi Dll in c#

Posted on 2004-04-22
10
3,703 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
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
Instantly Create Instructional Tutorials

Contextual Guidance at the moment of need helps your employees adopt to new software or processes instantly. Boost knowledge retention and employee engagement step-by-step with one easy solution.

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

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

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

Extention Methods in C# 3.0 by Ivo Stoykov C# 3.0 offers extension methods. They allow extending existing classes without changing the class's source code or relying on inheritance. These are static methods invoked as instance method. This…
Introduction This article series is supposed to shed some light on the use of IDisposable and objects that inherit from it. In essence, a more apt title for this article would be: using (IDisposable) {}. I’m just not sure how many people would ge…
This is a high-level webinar that covers the history of enterprise open source database use. It addresses both the advantages companies see in using open source database technologies, as well as the fears and reservations they might have. In this…
In this video, viewers are given an introduction to using the Windows 10 Snipping Tool, how to quickly locate it when it's needed and also how make it always available with a single click of a mouse button, by pinning it to the Desktop Task Bar. Int…

728 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