Chinaunix首页 | 论坛 | 博客
  • 博客访问: 455503
  • 博文数量: 724
  • 博客积分: 40000
  • 博客等级: 大将
  • 技术积分: 5010
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-13 14:47
文章分类

全部博文(724)

文章存档

2011年(1)

2008年(723)

我的朋友

分类:

2008-10-13 17:17:45

创建“通用的”动态链接库(DLL)

    最近有许多人问如何让动态链接库的输出函数能够被任何支持动态链接库的语言调用。写动态链接库是很EASY的事情。但是,他们大多觉得输出的名字有乱字符(如:_vbShiftRight@1)。本文将讨论如何让DLL输出的函数名字中不出现乱子符。以便让创建的DLL可以在VB中使用。
    首先需要实现DLL的入口点函数并保证代码使用 stdcall 调用规范,但这要依赖你使用的编译器。例如,你可以在VC中使用“/entry:"DLLEntry"”命令行编译选项来创建自己的入口点。“DLLEntry” 可以参考下列代码:
/////////////////////////////////////////////////////////////////////
// DLL initialization and clean-up.
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
   switch(fdwReason) {

      case DLL_PROCESS_ATTACH:

         // Perform any DLL initialization here
         break;

      case DLL_PROCESS_DETACH:

         // Perform any DLL cleanup here
         break;

   }
   return TRUE;
}
为了保证你使用正确的调用规范,要通知编译器使用stdcall规范和/或使用在windows.h(及相关文件)中定义的常量,如WINAPI等。通常DLL的代码如下:
/////////////////////////////////////////////////////////////////////
// Shifts bits right for integers.
WORD WINAPI vbShiftRight(WORD nValue, WORD nBits)
{
   return (nValue >> nBits);
}
下一步是创建一个DEF文件,与文档中描述的做法稍有不同。这是防止输出函数名不出现乱字符的有效方式(如_vbShiftRight@1)。DEF文件的形式如下:

EXPORTS
vbShiftRight

下一步是在VB中调用这个函数,使用以下声明:
Declare Function vbShiftRight Lib "MYDLL.DLL" (ByVal nValue As Integer, 
  ByVal nBits As Integer)

As Integer

Sub Test()
   Dim i As Integer
   i = vbShiftRight(4, 2)
   Debug.Assert i = 1
End Sub
如果你还想要更容易的方法从VB中调用,可以创建一个类型库。为此你需要创建和编译ODL(对象描述语言)文件。这个文件应该包含如下内容:
module MyModule {
   [
      helpstring("Shifts the bits of an integer to the right."),
      entry("vbShiftRight")
   ]
   short _stdcall vbShiftRight([in] short nValue, [in] short nBits);
};
    当VB加载DLL的类型库时,函数名和参数将出现在VB的对象浏览器中。此外,如果用户不输入正确的参数类型,VB将产生一个错误。
--------------------next---------------------

在vb和c写的dll交互过程中,当参数为int,long,等类型时都可以比较容易的解决,但是当要交互的参数为指针时,我不知该在vb中如何调用。
下面这个问题的关键在于,vb中是没有和c中指针相对等的数据类型的,而在c中也没有和vb中string相对应的类型。
我好不容易才找到你处:),你知道该如何解决吗,麻烦赐教,我的e-mail:sun1504@sohu.com
为了简单起见,先举个示例:
char * WINAPI mm(char *dd)
{ char *ss;
  ss=dd;
  register int tt=[1,2,3,4,5,6,7]
  for(int i=0;i<7;i++){
    *ss=tt[i];
    ss+=i;
  }
return ss;}
在VB中加入一标准模块,添加:
public declare function mm lib "libname.dll" (byref dd as any) as string
下面不知在VB中怎样调用此例程,我试着写了一个:
private sub command1_click
  dim ll as string
  ll="this is a example."
  debug.print mm(ll)
end sub
但这样不能达到将一字符串传进,作变换,再传出的目的,望指正.
( sun1504 发表于 2003-10-10 20:19:00)
 
在vb和c写的dll交互过程中,当参数为int,long,等类型时都可以解决,但是当要交互的对数为指针时,我不知该在vb中如何调用,因为我们都知道,vb中是没有和c中指针相对等的数据类型的,我好不容易才找到你处:),你知道吗,麻烦赐教,我的e-mail:sun1504@sohu.com
为了简单起见,先举个示例:
char * WINAPI mm(char *dd)
{ char *ss;
  ss=dd;
  for(int i=0;i
return dd;}
在VB中加入一标准模块,添加:
public declare function mm lib "libname.dll" (byref dd as any) as string
下面不知在VB中怎样调用此例程,我试着写了一个:
private sub command1_click
  dim ll as string
  ll="this is a example."
  debug.print mm(ll)
end sub
但这样不能达到将一字符串传进在传出的目的,望高手指正!!!急盼!!
( sun1504 发表于 2003-10-10 20:12:00)
 
有没有源程序,供大家享用? ( hdwxh 发表于 2003-5-27 11:13:00)
 
.......................................................

--------------------next---------------------

阅读(260) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~