delphi引用链接库————————————————————————————————
function GetPlateInfo(dIP,rst:Pchar):Boolean;cdecl;External 'LPRTCPTest.dll';
var
  Form1: TForm1;
implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
    rstbool:Boolean;
    rst:Pchar;
    IP:string;
    pIP:Pchar;
    buff:Pchar;
begin
    buff:=stralloc(256);
    IP:='192.168.1.100';
    pIP:=PChar(IP);
    rst:=TestC(pIP);
    rstbool:=GetPlateInfo(pIP,buff);
    Edit2.Text:=  buff;
end;
————————————————————————————————————————
dll中方法
————————————————————————————————————————
extern"C" _declspec(dllexport) bool GetPlateInfo(char* dftip, char* rst)
{
SOCKET client;
client = connetServer("192.168.1.100", 8131, TCP_BLOCK); char buff2[] = "{\n"
"\"plateInfo\":\"京AF0236\",\n"
"\"color\":\"yellow\",\n"
"\"timestamp\":\"2019-07-26 14:00:00\",\n"
"\"camera_state\":1,\n"
"}";
strcpy(rst, buff2);
return true;
}
————————————————————————————————————————
connectserver方法
————————————————————————————————————————
SOCKET connetServer(char *ip, int port, int block)
{
SOCKET client;
struct sockaddr_in addr;
unsigned long ip_addr = inet_addr(ip); if (INADDR_NONE == ip_addr)
{
printf("input right ip,eg:192.168.1.22\n");
return INVALID_SOCKET;
}
if(initializeWinsockIfNecessary() == 0)
{
printf("WSAStartup error!/n");
return INVALID_SOCKET;
}
client=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(INVALID_SOCKET == client)
{
printf("create socket error/n");
releaseWinsockIfNecessary();
return INVALID_SOCKET;
} if (block == TCP_UNBLOCK)
{
makeSocketNonBlocking(client);
}
else
{
makeSocketBlocking(client);
} addr.sin_family=AF_INET;
addr.sin_port=htons(port);
addr.sin_addr.s_addr= ip_addr;
if(connect(client,(struct sockaddr *)&addr,sizeof(addr))!=0)
{
printf("connect error/n");
closeSocket(client);
releaseWinsockIfNecessary();
return INVALID_SOCKET;
}
return client;
}
——————————————————————————————————————————

解决方案 »

  1.   

    stdcall
      

  2.   

    参数传递方式与DLL保持一致
      

  3.   

    指针的内存分配与释放
    procedure TForm1.Button1Click(Sender: TObject);
    var
        rstbool:Boolean;
        rst:Pchar;
        IP:string;
        pIP:Pchar;
        buff:Pchar;
    begin
        New(buff);
        New(pIP);
        IP:='192.168.1.100';
        pIP:=PChar(IP);
        rstbool:=GetPlateInfo(pIP,buff);
        Edit2.Text:=  buff;
        Dispose(buff);
        Dispose(pIP);
    end;