来自dll的回调函数传递垃圾字符串?

时间:2018-03-23 14:54:18

标签: delphi-2010

我正在使用EPSON Advanced Printer Driver,当我打开状态API时,我将打印机名称作为参数传递给DLL,当我读取Checks it return result作为回调程序(GetMicrDataEx)时,打印机名称传递给BiOpenMonPrinter 。 每个工作正常,除了回调函数中的打印机名称就像垃圾数据。

BiOpenMonPrinter:Function(nType:LongInt; pName:PAnsiChar):LongInt; CDECL;        // pName:指定打印机名称(例如:“EPSON TM-H6000II Receipt”)。

    @BiMICRSetReadBackEx:= getprocaddress(libraryhnd,PAnsiChar('BiMICRSetReadBackFunctionEx'));

//BiMICRSetReadBackEx Lib 'EpsStmApi.Dll" 
BiMICRSetReadBackEx:Function( nHandle : LongInt;{int} CallBack:TProcedurePortName; {int}
             Var readBuffSize : Integer; {LPBYTE} readCharBuff : Pointer; {LPBYTE}
             pStatus : Pointer; pDetail : Pointer): LongInt; Stdcall;

我将GetMicrDataEx作为回调程序传递。 问题是当我收到回叫时,打印机名称是长字符串与垃圾包机

Procedure GetMicrDataEx(sPrintername:PAnsiChar); 
begin
//I receive garbage for printer name
end;

BiOpenMonPrinter:

  

使Status API可用于打印机并返回句柄。

BiMICRSetReadBackFunctionEx:

  

通过BiMICRReadCheck执行检查读取并注册   同时通知结果时回调函数的地址   作为内存地址从哪里读取每种类型的信息   检查已设定。

我将非常感谢你的帮助 感谢

1 个答案:

答案 0 :(得分:0)

很可能这归结为不匹配的调用约定。您的GetMicrDataEx回调使用register调用约定。可能DLL需要一个使用stdcall的函数。让GetMicrDataEx使用stdcall来解决问题。

请注意,我不得不做出很多猜测来写这个答案,因为这个问题只包含了互操作界面的一面。对于这些问题,您确实需要包含互操作接口的两面。