gpt4 book ai didi

visual-studio - 为什么非托管导出示例在棱镜XE中不起作用

转载 作者:行者123 更新时间:2023-12-03 18:43:14 26 4
gpt4 key购买 nike

我正在尝试为 在XE中进行非托管导出编译,但是在构建时出现(PE9)未知标识符“ UnmanagedExport”错误。


在兼容性下,选择“允许不安全的代码”
在“生成”下,找到“常规”部分并将“ CPU类型”更改为“ x86”
右键单击已创建的“ ClassLibraryX”选项卡,然后选择“保存所选项目”



namespace exptest;

interface
uses
System.Runtime.InteropServices;

type
clstest = public static class
private
protected
public

[UnmanagedExport('xmsg',CallingConvention.StdCall)]
function xmsg(amsg : String):String;
end;

implementation

function clstest.xmsg(amsg: String):String;
Begin
Result := amsg + ' mesajı için geri dönüş';
end;



end.



This Example

任何想法?

@David:谢谢您的回答。我尝试过你的小费

public

[UnmanagedExport('xmsg',CallingConvention.StdCall)]
class method xmsg(amsg : String):String;
end;

implementation

class method clstest.xmsg(amsg: String):String;
Begin
Result := amsg + ' mesajı için geri dönüş';
end;


但同样的错误仍在继续。

@David 2 :):

我以这种方式更改了代码:

namespace exptest;

interface
uses
RemObjects.Oxygene.System;

type
clstest = public class
private
protected
public

[UnmanagedExport('xmsg',CallingConvention.StdCall)]
class method xmsg(amsg : String):String;
end;

implementation

class method clstest.xmsg(amsg: String):String;
Begin
Result := amsg + ' mesajı için geri dönüş';
end;



end.


同样的错误:)

@大卫3

namespace exptest;

interface
uses
RemObjects.Oxygene.System,System.Runtime.InteropServices;


type
clstest = public class
private
protected
public

[UnmanagedExport('xmsg',CallingConvention.StdCall)]
class method xmsg(amsg : String):String;
end;

implementation

class method clstest.xmsg(amsg: String):String;
Begin
Result := 'a return value for '+amsg ;
end;



end.


还是一样的错误。 :,(
你能帮我试一下棱镜吗?感谢您的回答。

    C:\Program Files\Embarcadero\Delphi Prism\bin>oxygene -version
RemObjects Oxygene for .NET - Version 4.0.25.791
Copyright RemObjects Software 2003-2009. All rights reserved.
Exclusively licensed for Delphi Prism.

Configuration Release not found


我想是我的氧气版本4.0.25.791。

....................................

@David:我也尝试在命令行上进行编译。这是结果

C:\Documents and Settings\XPMUser\Desktop\exptest\exptest>oxygene /allowunsafe:y
es /type:library /cputype:x86 clstest.pas
RemObjects Oxygene for .NET - Version 4.0.25.791
Copyright RemObjects Software 2003-2009. All rights reserved.
Exclusively licensed for Delphi Prism.

Preparing resources...
Compiling...
C:\Documents and Settings\XPMUser\Desktop\exptest\exptest\clstest.pas(14,22) :
Error : (PE9) Unknown identifier "UnmanagedExport"

Exiting with 1.

C:\Documents and Settings\XPMUser\Desktop\exptest\exptest>


可能是您的权利。也许我的编译器有问题。但是我在安装Delphi Prism时没有看到任何错误。

@Rudy:在此之前我曾尝试过VS2010 ide。就像我说的。也许我重新安装了delphi棱镜或尝试使用其他机器。如果解决,我会写结果。

最佳答案

我认为主要问题是您需要使用RemObjects.Oxygene.System命名空间,而UnmanagedExport是在此命名空间定义的。

实际上,看起来不需要uses(请参见下文)。



您还需要使该方法成为类方法。

[UnmanagedExport('xmsg',CallingConvention.StdCall)]
class function xmsg(amsg: String): String;


同样在实施中。

请注意,在棱镜中不建议使用 functionprocedure,而应使用 method

[UnmanagedExport('xmsg',CallingConvention.StdCall)]
class method xmsg(amsg: String): String;


该信息是从 docwiki中收集的。



我下载了Prism XE的命令行编译器。这是版本4.0,因此支持 UnmanagedExport属性。

我成功地编译了以下单元:

namespace ExportTest;

interface

uses
System.Runtime.InteropServices;

type
test = class
[UnmanagedExport('foo', CallingConvention.StdCall)]
class method foo: Integer;
end;

implementation

class method test.foo: Integer;
begin
Result := 666;
end;

end.


输出为:

C:\Desktop>oxygene /allowunsafe:yes /type:library /cputype:x86 test.pas
RemObjects Oxygene for .NET - Version 4.0.25.791
Copyright RemObjects Software 2003-2009. All rights reserved.
Exclusively licensed for Delphi Prism.

Preparing resources...
Compiling...
Compile complete.


这产生了一个DLL,我验证了它包含一个名为 foo的单个导出函数。

接下来,我通过ctypes从Python调用了DLL:

>>> import ctypes
>>> lib = ctypes.WinDLL('test.dll')
>>> lib.foo()
666


因此,我只能得出结论,您的问题不在于代码。您可能安装了错误的Prism安装。您可以尝试在上方重复我的命令行吗?您可以重新安装Prism吗?

关于visual-studio - 为什么非托管导出示例在棱镜XE中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7552288/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com