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

ami*_*min 5 delphi string parameters dll

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

int WriteUSB(PBYTE pBuffer, DWORD nNumberOfBytesToWrite);
Run Code Online (Sandbox Code Playgroud)

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

我声明这样的函数:

var
function WriteUSB(myP:pByte;n:DWORD): integer ; external 'my.dll';
Run Code Online (Sandbox Code Playgroud)

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

我这样调用DLL函数:

procedure myProc;
var 
   str : string:
begin
     str := 'AAAAAAAAAAAAAAAAAAAAA';
     WriteUSB(str,DWORD(length(tmp)));
end;
Run Code Online (Sandbox Code Playgroud)

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

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

Mas*_*ler 12

几件事.首先,如果这是一个C接口,它看起来像是,那么你需要声明导入如下:

function WriteUSB(myP:pAnsiChar; n:DWORD): integer; cdecl; external 'my.dll';
Run Code Online (Sandbox Code Playgroud)

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

procedure myProc;
var 
   str : AnsiString;
begin
     str := 'AAAAAAAAAAAAAAAAAAAAA';
     WriteUSB(PAnsiChar(str), length(str));
end;
Run Code Online (Sandbox Code Playgroud)

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


M S*_*kel 1

尝试在通话中使用 pchar 进行转换:

  WriteUSB(pchar(str),DWORD(length(tmp))); 
Run Code Online (Sandbox Code Playgroud)