如何从.Net调用Pb生成的本机Win32 dll?或者从其他地方?

时间:2008-12-10 20:15:27

标签: .net dll powerbuilder

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

场景1: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失败,并显示“Error calling external function ...”消息。

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

如何在生成的Pb代码中嵌入dll的Pb w / o中引用外部Win32 dll? 请记住,shared in是由Pb生成的一个单独的工作区。

场景2:.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'

使用编辑器/ dissasembler我发现函数名已被修改为“_getVtableInfo_f_get_hello_world @ 12”。我在声明中尝试了不同的命名变体,并且没有运气。

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

2 个答案:

答案 0 :(得分:2)

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

祝你好运,

特里。

答案 1 :(得分:0)

如果Pb在您的函数定义中服从“extern C”,那么它应该用未编号的名称导出它们。

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