我可以从Progress OpenEdge ABL调用C ++代码吗?

时间:2014-03-31 12:32:39

标签: c++ progress-4gl openedge

是否可以从Progress ABL中执行C ++代码?

具体来说,我希望使用函数SHGetKnownFolderPath (documentation here)来确定Windows 7计算机上“Documents”文件夹的位置,该文​​件夹将文档文件夹重定向到另一个位置。

或者,是否有其他方法可以确定此信息而无需检查注册表项?

3 个答案:

答案 0 :(得分:1)

您可以调用外部共享库和DLL。

http://documentation.progress.com/output/OpenEdge113/pdfs/dvpin/dvpin.pdf

第3节"外部接口"是你在寻找的。

http://dbappraise.com/ppt/shlib.pptx也可能有所帮助。

由于它命名的方式,C ++经常会出现问题。你可能最好建立一个" shim"使用普通的旧C在OpenEdge和C ++之间架起桥梁

通过调用Windows系统功能通常很容易。类似的东西:

procedure SHGetKnownFolderPath external "pathToLibrary":
  define parameter a as someType.
  define parameter b as someType.
  define return parameter x as someType.
end.

答案 1 :(得分:0)

检查"编程接口"文档,"外部程序接口"部分。

此外,某些版本的ABL也支持直接.NET调用。

答案 2 :(得分:0)

在咨询了一些来源后,我能够在 10.2B 中使用它:

SHGetKnownFolderPath 的难点在于需要通过引用传递的 rfid 参数。 C# 具有注释 [System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPStruct)]ref 关键字。由于 Progress OpenEdge 对外部过程参数数据类型的限制,我无法弄清楚如何传递 System.Guid 的引用,因此我执行了 .NET Guid 的字节复制并通过 {{1} 传递了它}}。我很抱歉在这里过分依赖 .NET。

这是一个工作示例,它获取提供的已知文件夹 GUID,以及获取 Documents 文件夹的用法:

MEMPTR