首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用Dllimport在C#中调用此Delphi方法?

如何使用Dllimport在C#中调用此Delphi方法?
EN

Stack Overflow用户
提问于 2014-11-17 16:16:42
回答 1查看 1.6K关注 0票数 1

需要帮助的新程序员!

编译到DLL中的Delphi代码

代码语言:javascript
运行
复制
function SetCurrentSerial(Size : Integer; Msg : Pointer) : Integer stdcall;
var
  TempByte : PByte;
  TempStr : string;
  i: Integer;
begin
  Result := 0;
  TempByte := Msg;
  TempStr := '';
  for i := 0 to Size - 1 do
  begin
    TempStr := TempStr + ' ';
  end;

  for i := 0 to Size - 1 do
  begin
    TempStr[i+1] := Chr(TempByte^);
    Inc(TempByte);
  end;

  if not DLLClass.SelectDeviceSerial(TempStr) then
  begin
    Result := -1;
  end;
end;

C#码

代码语言:javascript
运行
复制
//Import a Function Pointer
[DllImport("Test.dll", CallingConvention= CallingConvention.StdCall, CharSet =  CharSet.Ansi)]
public unsafe static extern int SetCurrentSerial(int Size, byte[] Msg);

我需要将指针值、大小和Msg存储在缓冲区中,并在控制台窗口中打印该值。

我将非常感谢完整构造的代码。提前谢谢你。

这是我迄今尝试过的代码。//C#代码

代码语言:javascript
运行
复制
class Program
{
    [DllImport("Test.dll")]
    public unsafe static extern int SetCurrentSerial(int Size, void* Msg); 

    unsafe static void Main()
     {
        int Res;

        byte[] buffer = new byte[1024];

        Res = SetCurrentSerial(255, &buffer);

        Console.WriteLine("%s\n", buffer);
     }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-17 16:49:36

您的DLL函数设计错误。您正在将一个字符串从调用代码传递到DLL。这非常简单,而且您可以删除几乎所有的代码。Delphi代码应该如下所示:

代码语言:javascript
运行
复制
function SetCurrentSerial(Serial: PAnsiChar): LongBool; stdcall;
begin
  Result := DLLClass.SelectDeviceSerial(Serial);
end;

那么C#代码应该是:

代码语言:javascript
运行
复制
[DllImport("Test.dll", CallingConvention = CallingConvention.StdCall, 
    CharSet = CharSet.Ansi)]
public static extern bool SetCurrentSerial(string Serial);

按如下方式调用函数:

代码语言:javascript
运行
复制
bool succeeded = SetCurrentSerial(Serial);
if (!succeeded)
{
    // handle error
}

我已将整数返回值替换为指示成功或失败的布尔值。如果您希望还原为如下所示的整数:

Delphi

代码语言:javascript
运行
复制
function SetCurrentSerial(Serial: PAnsiChar): Integer; stdcall;
begin
  if DLLClass.SelectDeviceSerial(Serial) then begin
    Result := 0;
  end else begin
    Result := -1;
  end;
end;

C#

代码语言:javascript
运行
复制
[DllImport("Test.dll", CallingConvention = CallingConvention.StdCall, 
    CharSet = CharSet.Ansi)]
public static extern int SetCurrentSerial(string Serial);

更新

显然,您不能更改此DLL。这是令人遗憾的,因为它的设计和实施确实非常糟糕。但是,要从C#调用该函数,您需要如下所示声明p/invoke:

代码语言:javascript
运行
复制
[DllImport("Test.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int SetCurrentSerial(int Size, byte[] Msg);

然后这样称呼它:

代码语言:javascript
运行
复制
byte[] Msg = Encoding.Default.GetBytes(serial);
int retval = SetCurrentSerial(Msg.Length, Msg);
if (retval != 0)
{
    // handle error
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26976983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档