用于 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的主要内容,如果未能解决你的问题,请参考以下文章

foxpro中的&代表啥

如何使用 DAO 将列添加到 FoxPro 文件

将 Visual FoxPro 项目和数据库迁移到 PHP/Laravel Web 应用程序

Visual Foxpro有那些经典例题

SQL和 FOXPRO有啥区别?

利用visual foxpro将dbf文件转为excel文件之后 中文部分都是乱码如何解决呢?