2010-07-23 15 views
4

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

int WriteUSB(PBYTE pBuffer, DWORD nNumberOfBytesToWrite); 

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

我宣布这样的功能:

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

我应该使用stdcallcdecl在声明?

我调用的DLL函数是这样的:

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

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

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

回答

1

尝试在你的电话与PChar类型浇铸:

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

这是行不通的。 OP使用D2010,这意味着String和PChar是Unicode,每个字符可能超过1个字节。该DLL正在寻找一个指向BYTE的指针,并且没有迹象表明该DLL函数可以识别Unicode。 – 2010-07-23 16:03:22

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是不必要的),如果你不喜欢这样,它应该不给你任何麻烦的工作。

3

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

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无处不在。

+0

使用'TEncoding.Default'在功能上与将(Unicode)字符串分配给AnsiString相同,即:var str:AnsiString; str:='blah'; WriteUSB(PByte(PAnsiChar(str)),Length(str));' – 2010-07-24 06:30:11

+0

好的,我对此并不完全确定。但是,我认为围绕TBytes的做法比向前推进更好,并且减少了Delphi和PChar/PAnsiChar不同版本之间混淆的风险。另外,我通常会使用TEncoding.UTF8而不是.Default,但由于某种原因,认为在示例中最好使用.Default。不知道为什么。 – shunty 2010-07-26 07:24:32

+0

哎呀...是的,我意识到TEncoding是新的,所以需要ifdef以前的版本,但我仍然认为TBytes有助于消除混淆。 – shunty 2010-07-26 07:33:43

1

非常感谢所有的反馈意见。我通过结合你的反馈来使它工作。解决的办法是:

宣言(我加的cdecl):

function WriteUSB(pc:pByte;n:DWORD): integer ; cdecl; external 'my.dll'; 

和呼叫:

Procedure myProc; 
Var 
    str : string; 
    buff : TBytes; 
begin 
    str := 'My string"; 
    buff := TEncoding.Default.GetBytes(str); // of TEncoding.UTF8 or... etc 
      WriteUSB(pByte(@buff[0]), Length(buff)) 

... 
End; 

我确实有一些问题,与瑞典的字符,但我会解决它。现在我知道DLL调用是正确的。

再次感谢您的所有反馈。这是一个很棒的论坛。

BR 德尔福用户

相关问题