将Delphi字符串作为参数发送到DLL

时间:2010-07-23 02:23:17

标签: delphi string dll parameters

我想在Delphi 2010中调用DLL函数。此函数接受一个字符串并将其写入具有USB接口的打印机。我不知道DLL开发的语言是什么。根据文档,该函数的语法是:

int WriteUSB(PBYTE pBuffer, DWORD nNumberOfBytesToWrite);

如何在Delphi中声明和使用我的函数?

我声明了这样的函数:

var
function WriteUSB(myP:pByte;n:DWORD): integer ; external 'my.dll';

我应该在声明中使用stdcall还是cdecl

我像这样调用DLL函数:

procedure myProc;
var 
   str : string:
begin
     str := 'AAAAAAAAAAAAAAAAAAAAA';
     WriteUSB(str,DWORD(length(tmp)));
end;

但是这段代码总是给我一个例外。我知道问题是String是Unicode,每个字符> 1个字节。我尝试转换为不同的字符串类型(AnsiCharShortString),但我失败了。

这样做的正确方法是什么?

4 个答案:

答案 0 :(得分:11)

一些事情。首先,如果这是一个C接口,它看起来像是这样,那么你需要像这样声明导入:

function WriteUSB(myP:pAnsiChar; n:DWORD): integer; cdecl; external 'my.dll';

然后要调用该函数,您需要使用Ansi字符串,并将其转换为PAnsiChar,如下所示:

procedure myProc;
var 
   str : AnsiString;
begin
     str := 'AAAAAAAAAAAAAAAAAAAAA';
     WriteUSB(PAnsiChar(str), length(str));
end;

(转换为DWORD是不必要的。)如果你这样做,它应该工作,而不会给你带来任何麻烦。

答案 1 :(得分:3)

如果你只想使用Ansi字符,你可以将字符串转换为AnsiString(如前所述)但是如果你想使用unicode字符串并且DLL /打印机会接受它们你可以尝试一些东西(未经测试但我认为这通常是相关的):

procedure myProc;
var
  str: string;
  buff: TBytes;
begin
  str := 'blahblahblah'; // plus additional unicode stuff
  buff := TEncoding.Default.GetBytes(str); // of TEncoding.UTF8 or... etc
  WriteUSB(@buff[0], Length(buff));
end;

不知道这是否适用于这个特定的DLL,但它是一种更通用的方法来处理转换到unicode字符串而不必在任何地方假设(并转换为)AnsiString。

答案 2 :(得分:1)

尝试在通话中使用pchar进行投射:

  WriteUSB(pchar(str),DWORD(length(tmp))); 

答案 3 :(得分:1)

相关问题