用于 FoxPro 的 c++ dll
Posted
技术标签:
【中文标题】用于 FoxPro 的 c++ dll【英文标题】:c++ dll for FoxPro 【发布时间】:2012-11-30 03:13:10 【问题描述】:我有一个用 FoxPro 编译的程序,它调用 d1.dll 函数。 d1.dll 是使用 Delphi 2007 开发的。我需要开发 d1.dll,它将使用 c++ 替换现有的。经过多次测试,FoxPro 应用程序在随机位置崩溃,并显示如下随机消息:
致命错误:异常代码=C0000005 @ 2012.12.12 11:33。错误日志 文件:C:\Program Files\Common Files\Microsoft Shared\VFP\vfp9rerr.log
或
没有足够的内存执行 some_function
我已经从 c++ dll 中删除了所有代码,只留下了一些原始 dll 通常返回的测试值。但这无济于事。声明和变量使用可能有问题。
我已经按照 Fox Pro 主程序中声明 d1.dll 函数的方式构建了 Fox Pro 小测试程序。不幸的是它没有崩溃。我从 IDE 运行它,而我的程序从可执行文件运行,但我认为这不是原因。可能有一些关于变量使用的问题。
可能有什么问题?
Delphi 和 C++ 中的函数声明:
C++
extern "C" int _stdcall f1(unsigned char *aError)
extern "C" int_stdcall f2(char *txt,unsigned char *aError)
extern "C" int _stdcall f3(unsigned char *aError, char *aAnswer)
extern "C" int _stdcall f4(unsigned char *aError)
extern "C" int _stdcall f5( char* 描述符, 字符 x, 双公关, char aError, 双倍数量, char kd, char* pd ) extern "C" int _stdcall f6(char *acomment_string, unsigned char* aError)
extern "C" int _stdcall f7(unsigned chartender_number, double amount, unsigned char *aError)
extern "C" int _stdcall f8(unsigned char *aError)
德尔福 2007
函数 f1(var aError: byte):bool;标准调用; 函数 f2(txt: pchar; var aError: byte):bool;标准调用;
函数 f3(var aError: byte; adata: pchar):bool;标准调用;
函数 f4(var aError: byte):bool;标准调用;
function f5(descriptor: pchar;x: byte; pr: double; var aError: byte ; 数量:双; kd : pchar ; pd: pchar ):bool;标准调用;
function f6(non_fiscal_string: pchar; var aError: byte):bool;标准调用;
function f7(tender_number:byte; amount:double; var aError: byte):bool; 标准调用;
函数 f8 (var aError: byte):bool;标准调用;
FoxPro 测试程序
FoxPro FoxPro
在 c:\d1.dll 字符串中声明整数 f1 错误
在 c:\d1.dll string txt,string err 中声明整数 f2
在c:\d1.dll字符串err,字符串rec_nr中声明整数f3
在 c:\d1.dll 字符串中声明整数 f4 错误
在 c:\d1.dll 字符串描述中声明整数 f5,整数 x,双精度数 ,string err, double qty, string kd, string pd
在 c:\d1.dll 字符串 non_fiscal_string,string err 中声明整数 f6
在 c:\d1.dll 中声明整数 f7 整数招标,双倍金额,字符串 错了
在 c:\d1.dll 字符串中声明整数 f8 错误
aLength=2048
aCardinal=4
ff_log=space(aLength)
rec_nr=SPACE(aCardinal)
fiscal_rec_nr=SPACE(aCardinal)
serial_nr = SPACE(aLength)
status_bytes=SPACE(aCardinal)
descr = "descr"
x =1 pr = 123 t=0 t= f2(descr,@kl)
t= f1(@kl)
Thisform.text1.Value=ff_log
t= f2(descr,@kl)
t= f4(@kl)
t=f3(@kl,@ff_log) t=GetStatus(@kl,rec_nr,fiscal_rec_nr,serial_nr,status_bytes)
t= f5(descr,x,pr,@kl, 1, "","")
t= f2(descr,@kl)
t= f2(descr,@kl)
t=f6(descr,@kl)
t=f8(@kl)
t=f7(1,100,@kl)
【问题讨论】:
引用错误信息时总是粘贴文字,不要从内存中重写。你永远不知道你可能会留下什么(它也可以让你避免尴尬的拼写错误。) -1 您必须修复格式。使用代码块而不是引号。请注意此时问题中的斜体字。我敢肯定,这些不是你想要的。另外,您希望我们如何调试它?我们看不到任何代码!! 【参考方案1】:1) 编辑问题 - 在您的 delphi 版本中添加标签。这不仅是礼貌,而且在这里可能很重要。
2) 您在 FoxPro 代码中看到“字符串”引用 - 这可能意味着您的 char*
听到的是 C 字符串(又名 ASCIIZ 字符串,又名零终止字符串)
他们需要某种特殊待遇。尝试将它们传递为 PAnsiChar - 比如 - function f1(const aError: PAnsiChar):bool; stdcall;
阅读有关 Delphi PChar 类型的帮助 - 但始终在固定 DLL API 中使用 PAnsiChar
:PChar 在不同的 Delphi 版本中不明确 - 映射到 PAnsiChar 或 PWideChar
3) 返回正确的数据类型。不是布尔值。
在 c:\d1.dll 字符串 txt 中声明 integer f2,字符串 err extern "C" int _stdcall f2(char *txt,unsigned char *aError) 函数 f2(const txt, aError: PAnsiChar): 整数;标准调用;
【讨论】:
在 Delphi 代码中无需更改某些内容。使用 Visual c++ 完成的 dll 崩溃 好吧,那就逆向转换吧!var x: byte
代表 by-ref unsigned char& x
; Bool 是一些 windows 布尔类型 - 在 docwiki.embarcadero.com 上搜索它并使用正确的 windows 类型。而且您的 FoxPro 代码似乎与 Delphi 代码不一致 - 在某些字符串中 Delphi 代码没有它们。只有 PChar aka PAnsiChar 是字符串。不是字符和类型
你还应该配置 VC++ 来制作非 Unicode 库,所以它会有 1 字节字符,而不是 2 字节字符
@Arioch'The 不,你在最近的评论中弄错了。在 Windows 上,char
始终只是一个 8 位字节。 16 位字符类型为wchar_t
。
@Arioch'The 是的,有TCHAR
的东西,但这里的代码是char
。以上是关于用于 FoxPro 的 c++ dll的主要内容,如果未能解决你的问题,请参考以下文章