【问题标题】:How to use tagDEC in Delphi如何在 Delphi 中使用 tagDEC
【发布时间】:2011-05-26 00:13:58
【问题描述】:

我已经将一个通过 COM Interop 提供的 .Net 类库导入到 Delphi 2007,并且提供了一个 Decimal 数据类型作为 tagDEC 打包记录。如何填写使用此记录类型以便可以使用类库?
提示

编辑

下面是我的 C# 代码,它通过 COM 互操作公开为 ActiveX:

  [ComVisible(true)]
  [ClassInterface(ClassInterfaceType.AutoDual)]
  [ProgId("ClassLibrary.Class1")]
  public class Class1
  {
    [ComVisible(true)]
    public string Method1(DateTime pDateTime, int pID, decimal pQty)
    {
...........    
    }
  }

我在 PC 上使用 Delphi 注册了 regasm 库,使用以下命令:

C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe .\ClassLibrary.dll /tlb:ClassLibrary.tlb

在Delphi 2007中,通过Import Component,导入类型库,在代理类中转换为如下方法:

function Method1(pDateTime: TDateTime; pID: Integer; pQty: TDecimal): WideString;

TDecimal 实际上是 packed record 类型的 tagDEC,在 ActiveX 单元中找到。下面是它的语法:

{ from WTYPES.H }
  PDecimal = ^TDecimal;
  {$EXTERNALSYM tagDEC}
  tagDEC = packed record
    wReserved: Word;
    case Integer of
      0: (scale, sign: Byte; Hi32: Longint;
      case Integer of
        0: (Lo32, Mid32: Longint);
        1: (Lo64: LONGLONG));
      1: (signscale: Word);
  end;
  TDecimal = tagDEC;
  {$EXTERNALSYM DECIMAL}
  DECIMAL = TDecimal;

我的问题是如何填写,以便将十进制值传递给 .Net 类库方法?有辅助功能吗?我没有找到。
再次感谢!

【问题讨论】:

  • 目前回答这个问题有点困难。您能否提供更多详细信息。
  • tagDEC打包记录的结构是什么?它来自哪里... RTL?
  • 刚刚编辑了包含所有详细信息、C# 和 Delphi 的帖子。太感谢了

标签: .net delphi com com-interop delphi-2007


【解决方案1】:

你为什么不简单地尝试一下?我不是 .NETty,所以我不能测试,但是

例如将 scale 设置为 10000,将 hi32 设置为 5432 并将 sign 设置为 0。因此,幸运的是尝试通过 +5432/10000= 0.5432,假设 sign 为 TRUE 表示负数,0 表示正数(可能反过来)

我有点担心你的标题。 “p”匈牙利语前缀似乎表示指针值。

  var x : TAGDEC;
  begin
    x.scale:=10000;
    x.hi32:=5432;
    x.sign:=0;
    comobject.method1(theDateTime,thePID,x);
  end;

【讨论】:

【解决方案2】:

如果您愿意,可以将 Decimal 视为不透明类型。为此,您将从 C# 代码中导出合成 Decimal 值所需的帮助程序,然后从 Delphi 调用该代码。我的猜测是你会想要一个 Double -> Decimal 助手,反之亦然。

或者,您可以修改 C#/COM 接口以使用双精度并在围栏的 C# 侧转换为十进制。

【讨论】:

  • 我确实这样做是为了继续项目并交付它。我发布了这个问题,看看是否有人实际使用过这个 tagDEC 记录类型,所以我可以正确地做到这一点。毕竟,将来我可能无法更改变量的数据类型,因此我可以在 Delphi 中使用它。 Tks
  • @Pascal 我认为如果您可以利用 .net 的 Decimal 知识,那总是可行的方法。我在 Decimal 类型上找到的最佳文档位于 msdn.microsoft.com/en-us/library/cc208367.aspx
  • 感谢链接。这比我拥有的这个(msdn.microsoft.com/en-us/library/ms221061.aspx)好多了。我试试看
【解决方案3】:

巧合的是,本周我遇到了相反的问题:我在 Delphi 中通过 COM 使用 C# 库,其中一些 C# 方法返回 decimal(在 Delphi 中为 TDecimaltagDEC),并且还想知道如何处理它。

在搜索了 ActiveX、ComObj 和 OleServer 单元后,我发现了这个函数:

VarR8FromDec(PDecimal, out double);

哪个成功了。我有 Delphi,也没有前面提到的可用资源,但很有可能你会在这些单元中找到一种方法,它会做相反的事情。

不是一个明确的答案,但也许对你有帮助。

【讨论】:

    猜你喜欢
    • 2021-10-25
    • 2014-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多