gpt4 book ai didi

delphi - 我使用Delphi调用DLL,但仍然出现错误

转载 作者:行者123 更新时间:2023-12-03 18:42:19 25 4
gpt4 key购买 nike

这是调用代码

unit CY;

interface
uses windows;
type

TMember_Rd = Record
iID: integer;
sCode: Array[0..255] of char;
sName: Array[0..255] of char;
end;

PTMember_Rd = ^TMember_Rd;

function GetMember(sStore, sMachine: PChar; const sTrack, sCode, sVerify: PChar;
Member: PTMember_Rd; sError: PChar): Integer; stdcall; external 'Interface.dll';

implementation

end.


我需要调用GetMember函数并将数据填充到Member中,如果有任何错误,我可以从sError中获取消息。

如何调用此功能?

我对Delphi不熟悉。我认为我的错误在于指针。

以下是我的C#代码正常工作

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;

namespace JFTest
{
public class JFService
{
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct PTMember_Rd
{
public Int32 id;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string sCode;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string sName;
}

[DllImport("Interface.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern int GetMember(StringBuilder sStore, StringBuilder sMachine, StringBuilder sTrack, StringBuilder sCode, StringBuilder sVerify, ref PTMember_Rd Member, [MarshalAs(UnmanagedType.LPStr)] string sError);

}
}


而且我没有其他附带代码,dll是客户发送给我的,并且他们没有源代码。

最佳答案

我认为您的P /调用代码是错误的。您说MembersError是输出参数,而其他参数是输入。在这种情况下,p /调用应为:

[DllImport("Interface.dll", CharSet=CharSet.Ansi)]
public static extern int GetMember(
string sStore,
string sMachine,
string sTrack,
string sCode,
string sVerify,
ref PTMember_Rd Member,
StringBuilder sError
);


假设这是正确的,Delphi应该如下所示:

type
TMember_Rd = Record
iID: integer;
sCode: Array[0..255] of AnsiChar;
sName: Array[0..255] of AnsiChar;
end;

function GetMember(
sStore: PAnsiChar;
sMachine: PAnsiChar;
sTrack: PAnsiChar;
sCode: PAnsiChar;
sVerify: PAnsiChar;
out Member: TMember_Rd;
sError: PAnsiChar
): Integer; stdcall; external 'Interface.dll';


其中 sStoresMachine等是用于指定输入参数的字符串变量。

我们需要使用一个字节 AnsiCharPAnsiChar。问题中的代码使用两个字节的UTF-16 CharPChar

您可以这样称呼它:

var
sError: AnsiString;
Member: TMember_Rd;
retval: Integer;
....
SetLength(sError, 256);
retval := GetMember(
PAnsiChar(AnsiString(sStore)),
PAnsiChar(AnsiString(sMachine)),
PAnsiChar(AnsiString(sTrack)),
PAnsiChar(AnsiString(sCode)),
PAnsiChar(AnsiString(sVerify)),
Member,
PAnsiChar(AnsiString(sError))
);


我不知道 sError字符串需要多大。如果没有任何文档,则找不到。最好扩大规模,并希望取得最好的成绩。如果没有足够大,并且该函数尝试写入该缓冲区,则缓冲区溢出。

我假设 Member参数具有纯粹的语义,因为这就是您所说的。如果您需要使用某些或所有字段来传递数据,请将其更改为 var并相应地初始化记录。

关于delphi - 我使用Delphi调用DLL,但仍然出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16197077/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com