E2065:不满意的前瞻性或外部声明

时间:2015-10-28 20:21:27

标签: delphi delphi-2009

我有一个c功能' cGetLen'我想从delphi2009中调用它,但得到了上面的标题错误。

有什么帮助吗?

这是代码

unit testpas;

interface

function dFunc():Integer ; stdcall; 


implementation


function cGetLen(str1, str2: PAnsiChar): Integer ; cdecl; external;


function dFunc():Integer ; stdcall; 
var
    fstr1: ANSIString;
    sstr2: ANSIString;
begin   
    fstr1 := 'hello';
    sstr2 := 'there';

    dFunc := cGetLen( PAnsiChar(fstr1), PAnsiChar(sstr2) );

end;

begin

end.

1 个答案:

答案 0 :(得分:4)

第一个问题是您没有链接外部对象。您需要包括:

{$LINK cGetLen.obj} // or whatever the object file is called

单位的某个地方。

一旦你完成了,你可能会面临另一个问题,因为C编译器将装饰该函数的名称。通常,对于cdecl函数,通过为下划线添加前缀。所以你可以导入这样的函数:

function cGetLen(str1, str2: PAnsiChar): Integer ; cdecl; external name '_cGetLen';

function _cGetLen(str1, str2: PAnsiChar): Integer ; cdecl;

您将面临的另一个常见问题是C函数调用其他无法解析的函数。它们需要在您链接的单独目标文件中实现,或者在Pascal代码中实现。

请记住,我看不到您的C代码,也不知道您是如何编译它的。所以,这些问题可能不会影响你,或者你可能面临其他问题。像这样的互操作问题确实需要完全披露。

说实话,你似乎距离成功还有很长的路要走。我建议你暂停这个任务,并牢牢掌握这个主题。从这里开始:http://praxis-velthuis.de/rdc/articles/articles-cobjs.html