【问题标题】:Rewrite Delphi DLL-calls in c#在 C# 中重写 Delphi DLL 调用
【发布时间】:2011-10-30 09:02:10
【问题描述】:

我想用 C# 编写一个 DMX Lightcontrol 软件。我的问题是我必须将 DLL 调用从 Delphi 重写为 C#。以下代码显示了我的尝试:

//德尔福代码:

function GetDMXInterface: pchar; stdcall; external 'DMX510.dll';
function SetLevel(a: array of byte): boolean; stdcall; external 'DMX510.dll';
function GetMaxChannels: integer; external 'DMX510.dll';

//我自己的C#-代码:

[DllImport("DMX510.DLL")]
public static extern char* GetDMXInterface();
[DllImport("DMX510.DLL")]
public static extern Boolean SetLevel(Byte[] bytearray);
[DllImport("DMX510.DLL")]
public static extern int GetMaxChannels();

下一个问题如何将GetDMXInterface()返回的char指针转换为String

感谢您的帮助!

【问题讨论】:

标签: c# delphi dll pinvoke


【解决方案1】:

尝试,但我不知道它是否有效,因为我无法测试它:

[DllImport("DMX510.DLL")]
public static extern StringBuilder GetDMXInterface();

或者试试

[DllImport("DMX510.DLL", CharSet = CharSet.Unicode, 
 CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr GetDMXInterface();

然后

IntPtr ptr = GetDMXInterface(); 
string msg = Marshal.PtrToStringAuto(ptr);

【讨论】:

  • public static extern StringBuilder GetDMXInterface();确实有效!谢谢!
  • @pbcoder: 是的,我的第一个答案 ;) 很高兴我帮您解决了问题 :)
  • Byte[] byteArray = new Byte[GetMaxChannels()];字节数组[0] = 75; SetLevel(byteArray);抛出异常这个问题有什么解决办法吗?
猜你喜欢
  • 2015-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多