fatalogId=63364&eliteId=63364_10a6fcc27670cd4),但有两点不清要澄清。编译成ole控件调用就可以调用, 用ConnectToNewObject()这个函数。
一、首先用pb生成dll,步骤如下:
1新建一个COM/MTS控件(名称:n_test),一路next即可
2完成后会生成一个project和一个不可视对象。
3在n_test内写一个函数:f_change,返回值为long,参数al_a(long),代码如下: if al_a = 1 then return 1 else return 0 end if。要澄清的是必须在n_test内定义,而不要把函数定义为全局的。
4在工程的的属性project窗口中,其中object页的Program ID(这里是PB80n_test)就是我们要连的对象名
5生成dll,就是deploy 。要澄清的是生成时应同时注册控件,否则就要用regsvr32注册了testdll。
二、调用dll
1声明:Function Long f_change(Long al_a) LIBRARY "testdll"
2调用,代码如下:
oleobject lole_1
lole_1=create oleobject
lole_1connecttonewobject("PB80n_test") //PB80n_test为dll的Program ID int
lint_1,lint_2 lint_2 = 1 lint_1=lole_1f_change(lint_2)
messagebox("returnvalue",string(lint_1))
lole_1disconnectobject( )
destroy lole_1
3运行,当传入1时,返回1,传入其他数字时,返回0。
和编写一般的DLL方法相同,需要注意以下两点:
(1)调用约定
编写供PB调用DLL,请使用_stdcall调用约定,如下所示:
extern C _declspec(dllexport) int _stdcall GetInt(char name){
}(2)def文件
在VC++中,如果生成DLL可以不使用def文件,只需要在VC++的函数定义前加__declspec(dllexport)修饰就可以了。生成的DLL VC++用户可以直接使用,但PB、VB等用户使用会遇到函数名转换的问题。因为VC++对于__declspec(dllexport)声明的函数会进行名称转换,如下面的函数:
__declspec(dllexport) int _stdcall GetStr()
编译后会转换为 GetStr@0,这样在PB、VB中声明函数时应该声明GetStr@0,
如果函数带有参数,转换后的函数名将更加复杂,这使PB、VB用户使用起来很不方便。在def文件中由EXPORT输出函数可解决这个问题。
如dll要输出如下两个函数:
extern C _declspec(dllexport) int _stdcall GetInt(char name);
extern C _declspec(dllexport) char _stdcall GetStr(int id);
则def文件书写如下(TEST为工程名):
LIBRARY TEST
DESCRIPTION 'TEST Windows Dynamic Link Library'EXPORTS; Explicit exports can go hereGetInt @1GetStr @2编译生成DLL后,在PB中要调用GetStr函数,只需做如下声明即可:
注意,如果您建的是Win32 Dynamic-Link Library 工程,def文件需要自己创建,然后把它加入工程,def文件名需和工程名相同。如您的工程名为test,则创建testdef。
以上就是关于pb可视化用户控件能生成dll吗全部的内容,包括:pb可视化用户控件能生成dll吗、如何用vc编写供pb调用的dll、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)