作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在Delphi 2010中调用一个DLL函数。该函数接受一个字符串并将其写入具有USB接口(interface)的打印机。我不知道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
),但失败了。
正确的做法是什么?
最佳答案
有几件事。首先,如果这是一个 C 接口(interface)(看起来确实如此),那么您需要像这样声明导入:
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。)如果您这样做,它应该可以正常工作,不会给您带来任何麻烦。
关于delphi - 将 Delphi 字符串作为参数发送给 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3314963/
我是一名优秀的程序员,十分优秀!