我想在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个字节。我尝试转换为不同的字符串类型(AnsiChar
和ShortString
),但我失败了。
这样做的正确方法是什么?
答案 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)