我正在使用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执行检查读取并注册 同时通知结果时回调函数的地址 作为内存地址从哪里读取每种类型的信息 检查已设定。
我将非常感谢你的帮助 感谢
答案 0 :(得分:0)
很可能这归结为不匹配的调用约定。您的GetMicrDataEx
回调使用register
调用约定。可能DLL需要一个使用stdcall
的函数。让GetMicrDataEx
使用stdcall
来解决问题。
请注意,我不得不做出很多猜测来写这个答案,因为这个问题只包含了互操作界面的一面。对于这些问题,您确实需要包含互操作接口的两面。