用COM吧
注意::不要用mfc擴展dll方式編,要用標準dll
对不起给为大虾,我还不懂,我比较笨
我的dll不是mfc编的,没有用向导,包含的也是windows.h,但是vb里还是用不了怎么改呢?
vb中是这样调用的
Private Declare Function XXXXX Lib "你的DLL" (ByVal 你的参数) As 你的返回值
不过MFC编的DLL不行
不经人同意就转载了一篇,哎!调用Windows的动态链接库许多熟练使用C的程序员在使用PowerBuilder时都希望自己以前在C上做的工作可以被PowerBuilder引用,这是完全可以的。在PowerBuilder中你可以通过外部引用函数的形式来调用动态连接库中的函数。PowerBuilder调用DLL程序使用规则PowerBuilder可以支持任何一种非PowerScript编写,并存储在动态链接库中的外部函数或过程的调用。但外部函数的参数必须是符合Pascal规则的(即参数压栈顺序从前至后)。在函数调用前,因先作函数声明,PowerBuilder支持以下两种外部函数类型:·全局函数:可以在应用的任意位置调用;·局部外部函数:在window,menu,user object或用户自定义函数等对象中定义。外部函数声明的语法是:{Access}FUNCTION ReturnDataType Function-Name({REF}{DataTypel Arg1,...,DataTypeN ArgN})LIBRARY LibName外部过程声明的语法是:{Access}SUBROUTION Subroutine({REF}{DataType1 Arg1,...,DataTypeN ArgN})如果您使用的是局部外部函数的声明,您还可以指定对象的访问权限:Public,Private,Protected。对局部函数权限访问的限制同对对象的实例变量的限制相同。您可以指定对象名加函数名的方式调用外部函数:object.function(arguments)如在window的w_emp上调用局部外部函数Recog(),就可这样使用:w_emp.Recog()如何在PowerBuilder与DLL之间传递参数在PowerBuilder的script中调用DLL中的函数,缺省情况下是通过传值法来传递参数(passed by value),也就是说PowerBuilder将对要传递的参数做一份拷贝,然后通过堆栈将这份拷贝传递给函数。如果你希望DLL中的函数可以改变调用参数的原值,就可以通过参考传值法(passed by reference)来传递参数,即在参数类型前面加REF关键字来声明该参数将要用参考传值法。在使用DLL时有一些基本规则在MS Windows中,一个DLL在被装入内存后,只会有一个实例,不会因为多个程序使用同一个DLL而在内存中产生多个DLL拷贝。每个DLL只有一个最大为64K的数据段。缺省情况下,PowerBuilder都是使用传值法来传递参数。当你在函数应用说明时使用了REF关键字,PowerBuilder将传递一个32位的地址指针(段地址+偏移量)给被调用的函数,而不是只传递偏移量,这才能保证DLL中的函数能得到PowerBuilder中数据的正确地址。在PowerBuilder中使用的数据类型与C语言支持的数据类型不尽相同,C中不支持的数据类型应在调用前先行转换。对于结构,要在C和PowerBuilder中做相等的说明。PowerBuilder不支持函数指针的传递,因此在PowerBuilder中不能使用回调函数(callback funcion)。如果DLL的参数需要空指针(NULL),你可以向函数传递一个值为0的长整型。Windows中使用的有些数据类型C中并不支持,但一般在C的预编译器中用TYPEDEF作预定义,同PowerBuilder接口也应当作适当转换。使用DLL的常见错误和需要注意的地方1.导致保护性错(general protection fault)在Windows中,如果你企图访问不是属于你的应用程序的内存将导致保护性错。导致保护性错的原因可能有以下几点:a.向DLL中的函数传递了不正确的参数。这种错误是比较难调试的,因为PowerBuilder的调试器不能跟踪到C程序中。你可以通过在C中使用MessageBox函数显示调用参数的方法来检查参数传递的正确性。更全面的方法是使用Windows的调试版本(带有调试信息的Windows环境)和功能更强的调试器(Soft-ice for windows或CodeView等);b.C中对数组的访问超出了PowerBuilder中申请的边界。在C中是不作数组边界检查的,这可能是导致保护性错的最常见的原因;c.使用了已经释放的内存指针。你最好把已经释放的内存指针置为NULL,以便在使用前进行判断。2.使用远指针在C中,所有的静态变量和全局变量都是在程序的数据堆中分配的,其他变量都是在栈中分配的。DLL可以有自己的数据段,但是它没有堆栈段,使用的是调用程序的堆栈。这就意味着寄存器DS指向的是DLL数据段,SS指向PowerBuilder应用程序的堆栈。而一般的Windows应用程序中,DS和SS是相同的,你可以使用近指针,但在调用DLL中引用远堆的变量必须使用32位的远指针。如果使用任何与内存寻址有关的C函数,都要使用C中的far版本。例如字符串拷贝函数,应该用_fstrcpy而不要用strcpy。3.注意静态变量的使用无论有多少实例调用同一个DLL,在内存中只有一份DLL代码。由于Windows是多任务的环境,因此DLL中的静态变量可能由于其他实例对此DLL的调用而改变。4.不要试图共享文件句柄在Windows环境下,不可能在应用程序和DLL间共享文件句柄。每个应用有各自的文件句柄表,如果两个应用通过一个DLL来访问同一个文件,它们必须分别打开这个文件。5.及时释放使用过的资源如果你的DLL中使用了GDI对象,一定要及时释放它们,否则会使Windows因申请GDI资源失败而死机;例如你建立了一个逻辑字体或逻辑笔,在使用完后,要用DeleteObject来删除它。6.为使PowerBuilder应用在Windows环境下正常运行,DLL应放在下列目录之中:·当前目录·Windows目录·Windows System目录·在DOS的路径中包括的目录
一个简单的方法:用 WINAPI 声明你的函数。比如int WINAPI func(){}然后就可以用调用WINAPI的约定来调用你的函数了。
记不太清啦你试一试加上_stdcall或加上WINAPI在Mfc生成的例子中大把大把.去看看.
大家帮帮忙
VC中编写ATL COM,然后注册,然后VB中引用就可以了。可以编写WIN32 DLL,然后按wzg_harbin(米西)方法调用。
什么叫标准dll?
只输出函数或者变量,并且函数参数的类型是一般的语言都包含的DLL;相对而言,扩展的DLL可以输出类,比如MFC的DLL都是扩展DLL。
MFC ex dll 在.h文件:AFX_EXT_API
MFC ex dll 在.h文件:AFX_EXT_API RETURNTYPE(返回类型) WINAPI FunName (...);动态DLL 在.h文件:__declspec(dllexport) RETURNTYPE(返回类型) WINAPI FunName (...);在.CPP 文件RETURNTYPE(返回类型) WINAPI FunName (...)
这样的dll可以作到vc和vb都可以用么?
请大虾继续跟贴!
关注
因为vc的c/c++编译器会改变动态连接库输出函数的名称,所以非vc写的程序一般无法链接到动态连结库中正确的函数,原因和解决的办法在Jeffrey Richter写的《windows 核心编程〉中有详细的介绍。简单地说可以在你的动态连结库的项目中加入一个*.def文件,里面加入EXPORTS节。比如:EXPORTSMYFUNC1MYFUNC2MYFUNC3另外,可以用Dependencies检验。
vc 编的dll一般有一个.def,一个.cpp,一个.h在.def 中加入你的出口export:function 1@1function 2@2
在vb中生成标准exe时,添加一个模块:declare sub function1 lib".dll"(byval a as integer,....)(函数无返回值,即void ...)declare function function2 lib".dll" () as 返回类型
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
暂无简介
文章 0 评论 0
接受
发布评论
评论(19)
用COM吧
注意::不要用mfc擴展dll方式編,要用標準dll
对不起给为大虾,我还不懂,我比较笨
我的dll不是mfc编的,没有用向导,包含的也是windows.h,但是vb里还是用不了怎么改呢?
vb中是这样调用的
Private Declare Function XXXXX Lib "你的DLL" (ByVal 你的参数) As 你的返回值
不过MFC编的DLL不行
不经人同意就转载了一篇,哎!
调用Windows的动态链接库
许多熟练使用C的程序员在使用PowerBuilder时都希望自己以前在C上做的工作可以被PowerBuilder引用,这是完全可以的。在PowerBuilder中你可以通过外部引用函数的形式来调用动态连接库中的函数。
PowerBuilder调用DLL程序使用规则
PowerBuilder可以支持任何一种非PowerScript编写,并存储在动态链接库中的外部函数或过程的调用。但外部函数的参数必须是符合Pascal规则的(即参数压栈顺序从前至后)。
在函数调用前,因先作函数声明,PowerBuilder支持以下两种外部函数类型:
·全局函数:可以在应用的任意位置调用;
·局部外部函数:在window,menu,user object或用户自定义函数等对象中定义。
外部函数声明的语法是:
{Access}FUNCTION ReturnDataType Function-Name({REF}{DataTypel Arg1,...,DataTypeN ArgN})LIBRARY LibName
外部过程声明的语法是:
{Access}SUBROUTION Subroutine({REF}{DataType1 Arg1,...,DataTypeN ArgN})
如果您使用的是局部外部函数的声明,您还可以指定对象的访问权限:Public,Private,Protected。对局部函数权限访问的限制同对对象的实例变量的限制相同。您可以指定对象名加函数名的方式调用外部函数:
object.function(arguments)
如在window的w_emp上调用局部外部函数Recog(),就可这样使用:
w_emp.Recog()
如何在PowerBuilder与DLL之间传递参数
在PowerBuilder的script中调用DLL中的函数,缺省情况下是通过传值法来传递参数(passed by value),也就是说PowerBuilder将对要传递的参数做一份拷贝,然后通过堆栈将这份拷贝传递给函数。如果你希望DLL中的函数可以改变调用参数的原值,就可以通过参考传值法(passed by reference)来传递参数,即在参数类型前面加REF关键字来声明该参数将要用参考传值法。
在使用DLL时有一些基本规则
在MS Windows中,一个DLL在被装入内存后,只会有一个实例,不会因为多个程序使用同一个DLL而在内存中产生多个DLL拷贝。每个DLL只有一个最大为64K的数据段。缺省情况下,PowerBuilder都是使用传值法来传递参数。当你在函数应用说明时使用了REF关键字,PowerBuilder将传递一个32位的地址指针(段地址+偏移量)给被调用的函数,而不是只传递偏移量,这才能保证DLL中的函数能得到PowerBuilder中数据的正确地址。在PowerBuilder中使用的数据类型与C语言支持的数据类型不尽相同,C中不支持的数据类型应在调用前先行转换。
对于结构,要在C和PowerBuilder中做相等的说明。
PowerBuilder不支持函数指针的传递,因此在PowerBuilder中不能使用回调函数(callback funcion)。如果DLL的参数需要空指针(NULL),你可以向函数传递一个值为0的长整型。
Windows中使用的有些数据类型C中并不支持,但一般在C的预编译器中用TYPEDEF作预定义,同PowerBuilder接口也应当作适当转换。
使用DLL的常见错误和需要注意的地方
1.导致保护性错(general protection fault)
在Windows中,如果你企图访问不是属于你的应用程序的内存将导致保护性错。导致保护性错的原因可能有以下几点:
a.向DLL中的函数传递了不正确的参数。这种错误是比较难调试的,因为PowerBuilder的调试器不能跟踪到C程序中。你可以通过在C中使用MessageBox函数显示调用参数的方法来检查参数传递的正确性。更全面的方法是使用Windows的调试版本(带有调试信息的Windows环境)和功能更强的调试器(Soft-ice for windows或CodeView等);
b.C中对数组的访问超出了PowerBuilder中申请的边界。在C中是不作数组边界检查的,这可能是导致保护性错的最常见的原因;
c.使用了已经释放的内存指针。你最好把已经释放的内存指针置为NULL,以便在使用前进行判断。
2.使用远指针
在C中,所有的静态变量和全局变量都是在程序的数据堆中分配的,其他变量都是在栈中分配的。DLL可以有自己的数据段,但是它没有堆栈段,使用的是调用程序的堆栈。这就意味着寄存器DS指向的是DLL数据段,SS指向PowerBuilder应用程序的堆栈。而一般的Windows应用程序中,DS和SS是相同的,你可以使用近指针,但在调用DLL中引用远堆的变量必须使用32位的远指针。如果使用任何与内存寻址有关的C函数,都要使用C中的far版本。例如字符串拷贝函数,应该用_fstrcpy而不要用strcpy。
3.注意静态变量的使用
无论有多少实例调用同一个DLL,在内存中只有一份DLL代码。由于Windows是多任务的环境,因此DLL中的静态变量可能由于其他实例对此DLL的调用而改变。
4.不要试图共享文件句柄
在Windows环境下,不可能在应用程序和DLL间共享文件句柄。每个应用有各自的文件句柄表,如果两个应用通过一个DLL来访问同一个文件,它们必须分别打开这个文件。
5.及时释放使用过的资源
如果你的DLL中使用了GDI对象,一定要及时释放它们,否则会使Windows因申请GDI资源失败而死机;例如你建立了一个逻辑字体或逻辑笔,在使用完后,要用DeleteObject来删除它。
6.为使PowerBuilder应用在Windows环境下正常运行,DLL应放在下列目录之中:
·当前目录
·Windows目录
·Windows System目录
·在DOS的路径中包括的目录
一个简单的方法:
用 WINAPI 声明你的函数。
比如
int WINAPI func()
{
}
然后就可以用调用WINAPI的约定来调用你的函数了。
记不太清啦
你试一试
加上_stdcall
或加上WINAPI
在Mfc生成的例子中大把大把.
去看看.
大家帮帮忙
VC中编写ATL COM,然后注册,然后VB中引用就可以了。
可以编写WIN32 DLL,然后按wzg_harbin(米西)方法调用。
什么叫标准dll?
只输出函数或者变量,并且函数参数的类型是一般的语言都包含的DLL;相对而言,扩展的DLL可以输出类,比如MFC的DLL都是扩展DLL。
MFC ex dll 在.h文件:
AFX_EXT_API
MFC ex dll 在.h文件:
AFX_EXT_API RETURNTYPE(返回类型) WINAPI FunName (...);
动态DLL 在.h文件:
__declspec(dllexport) RETURNTYPE(返回类型) WINAPI FunName (...);
在.CPP 文件
RETURNTYPE(返回类型) WINAPI FunName (...)
这样的dll可以作到vc和vb都可以用么?
请大虾继续跟贴!
关注
因为vc的c/c++编译器会改变动态连接库输出函数的名称,所以非vc写的程序一般无法链接到动态连结库中正确的函数,原因和解决的办法在Jeffrey Richter写的《windows 核心编程〉中有详细的介绍。简单地说可以在你的动态连结库的项目中加入一个*.def文件,里面加入EXPORTS节。比如:
EXPORTS
MYFUNC1
MYFUNC2
MYFUNC3
另外,可以用Dependencies检验。
vc 编的dll一般有一个.def,一个.cpp,一个.h
在.def 中加入你的出口export:
function 1@1
function 2@2
在vb中生成标准exe时,添加一个模块:
declare sub function1 lib".dll"(byval a as integer,....)(函数无返回值,即void ...)
declare function function2 lib".dll" () as 返回类型