2008-12-10 56 views
0

我一直试图链接到Pb(11.5)生成的原生Win32 dll:无论是从一个不同的Pb应用程序和.net(2.0)应用程序。我知道注册的COM对象对Pb可见。我想要做的是在原生Win32 DLL中使用Pb(运行11.5企业版)调用函数 - 而不是COM。我也想换个方式:我想要一个Win32 exe(native和.net)来调用Pb生成的dll函数。我的成功有限。如何从.Net调用Pb生成的原生Win32 dll?或从其他地方?

情况1:Pb生成原生Win32 exe文件& dll。

我创建了一个简单的应用程序,其中包含单独的pbl(称为shared.pbl)和一些简单的函数(包括返回字符串HelloWorld的函数)。该项目建立到一个EXE和一个单独的DLL。它的工作原理(单击一个按钮在标签中显示文本HelloWorld)。

单独铅工作区创建一个几乎相同的应用程序,但没有 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而不将Pb嵌入生成的Pb代码中?请记住,shared.dll是由铅在一个单独的工作区中生成的。

方案2:净EXE访问一个Pb生成的DLL

我下创建了一个简单的.NET应用程序(.NET 2.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?如果是这样,怎么样?

回答

2

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

祝你好运,

特里。

+0

谢谢!我开始怀疑这一点。我们绝望地转向.Net(我来自哪里),但必须找到一个零碎的方式来做到这一点。无法承受全部重写。 – erhm 2008-12-11 14:37:11

0

如果Pb服从你的函数定义中的“extern C”,那么它应该导出它们的未加密名称。

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