0

我一直在尝试链接到 Pb (11.5) 生成的本机 Win32 dll:来自不同的 Pb 应用程序和 .net (2.0) 应用程序。我知道注册的 COM 对象对 Pb 是可见的。我想要做的是在本机 Win32 dll 中使用 Pb(运行 11.5 Enterprise)调用函数——而不是 COM。我还想换一种方式:我想要一个 Win32 exe(本机和 .net)调用 Pb 生成的 dll 中的函数。我的成功有限。

场景一:pb 生成原生 Win32 exe & dll。

我创建了一个简单的应用程序,其中包括单独的 pbl(称为 shared.pbl)和一些琐碎的函数(包括返回字符串 HelloWorld 的函数)。该项目构建为一个 exe 和一个单独的 dll。它可以工作(单击按钮会在标签中显示文本 HelloWorld)。

在一个单独的Pb 工作区中,我创建了一个几乎相同的应用程序,但没有shared.pbl。我声明了一个外部函数来引用第一个工作区中的 shared.dll:

 function int GetSystemMetrics( int index ) library "user32.dll";
 function int f_rtn_int( int number ) library "shared.dll";

运行应用程序——单击绑定到 GetSystemMetrics() 的按钮有效。单击第二个按钮以访问 shared.dll 失败,并显示“调用外部函数时出错 ...”消息。

我能够让第二个应用程序工作的唯一方法是在目标属性的库列表选项卡下添加shared.dll。 然而,这似乎导致 dll 的内容嵌入到生成的 exe 中——我可以删除 shared.dll 并且第二个应用程序运行得很好!

如何在 Pb 中引用外部 Win32 dll,而无需将 dll 嵌入生成的 Pb 代码中? 请记住,shared.dll 是由 Pb 在单独的工作区中生成的。

场景二:.Net exe 访问 Pb 生成的 dll

接下来,我创建了一个简单的 .net 应用程序(.net v2.0,vs2005),它具有与 Pb 应用程序并行的功能。我引用shared.dll:

  [DllImport( "user32.dll" )]
  static extern int GetSystemMetrics( int smIndex );
  [DllImport( "shared.dll" )]
  static extern string f_get_hello_world();

并尝试调用 HelloWorld 函数,我得到 .net 错误:

 Unable to find an entry point named 'f_get_hello_world' in DLL 'shared.dll'

使用编辑器/反汇编器,我发现函数名称已被修改为“_getVtableInfo_f_get_hello_world@12”。我在声明上尝试了不同的命名变体,并在没有运气的情况下调用。

是否可以从另一种语言(c++、c#)引用由 Pb 创建的本机 Win32 dll?如果是这样,怎么做?

4

2 回答 2

2

基本上,你没有。您可以创建一个 COM 对象项目,或者使用 11 或 11.5 您可以创建一个 .NET 程序集。“本机”生成创建的 DLL 不是标准的 Windows DLL,因此不能用普通的 DLL 方法调用。

祝你好运,

特里。

于 2008-12-11T05:18:53.383 回答
0

如果 Pb 在您的函数定义中遵循“extern C”,那么它应该使用未损坏的名称导出它们。

对于为什么删除 dll 似乎可以并且程序仍然运行的另一个问题,我只能给出一个稍微可能的猜测:看看是否某个工具制作了 dll 的另一个副本并且它仍然存在。

于 2008-12-11T05:28:12.007 回答