需要帮助的新程序员!
编译到DLL中的Delphi代码
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#代码
//Import a Function Pointer
[DllImport("Test.dll", CallingConvention= CallingConvention.StdCall, CharSet = CharSet.Ansi)]
public unsafe static extern int SetCurrentSerial(int Size, byte[] Msg);
我需要将指针值,Size和Msg存储在缓冲区中,并在控制台窗口中打印该值。
我将非常感谢完全构造的代码。提前谢谢。
这是我到目前为止尝试过的代码。 // C#代码
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);
}
}
答案 0 :(得分:2)
您的DLL函数设计不正确。您正在从调用代码传递一个字符串到DLL。这很简单,您可以删除几乎所有代码。 Delphi代码应该是这样的:
function SetCurrentSerial(Serial: PAnsiChar): LongBool; stdcall;
begin
Result := DLLClass.SelectDeviceSerial(Serial);
end;
然后C#代码应为:
[DllImport("Test.dll", CallingConvention = CallingConvention.StdCall,
CharSet = CharSet.Ansi)]
public static extern bool SetCurrentSerial(string Serial);
像这样调用函数:
bool succeeded = SetCurrentSerial(Serial);
if (!succeeded)
{
// handle error
}
我用一个表示成功或失败的布尔值替换了整数返回值。您是否希望恢复为如下所示的整数:
<强>的Delphi 强>
function SetCurrentSerial(Serial: PAnsiChar): Integer; stdcall;
begin
if DLLClass.SelectDeviceSerial(Serial) then begin
Result := 0;
end else begin
Result := -1;
end;
end;
<强> C#强>
[DllImport("Test.dll", CallingConvention = CallingConvention.StdCall,
CharSet = CharSet.Ansi)]
public static extern int SetCurrentSerial(string Serial);
<强>更新强>
显然你无法改变这个DLL。这是一种耻辱,因为它的设计和实施非常糟糕。但是,要从C#调用该函数,您需要声明p / invoke,如下所示:
[DllImport("Test.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int SetCurrentSerial(int Size, byte[] Msg);
然后像这样称呼它:
byte[] Msg = Encoding.Default.GetBytes(serial);
int retval = SetCurrentSerial(Msg.Length, Msg);
if (retval != 0)
{
// handle error
}