★★vc写动态链接库用vb来调??★★

theng 2002-04-25 04:16:06
我想用vc写一个dll在vb中用,但vb却无法找到我要的函数SetCurrentIM。

dumpbin的结果如下:


Dump of file siplib.dll

File Type: DLL

Section contains the following exports for siplib.dll

0 characteristics
3CC7B1A9 time date stamp Thu Apr 25 15:35:05 2002
0.00 version
1 ordinal base
4 number of functions
4 number of names

ordinal hint RVA name

1 0 0000100A ??0CSiplib@@QAE@XZ
2 1 00001014 ??4CSiplib@@QAEAAV0@ABV0@@Z
3 2 0000100F ?SetCurrentIM@@YGXH@Z
4 3 0000494C ?nSiplib@@3HA

Summary

1000 .data
1000 .edata
1000 .idata
1000 .rdata
1000 .reloc
2000 .text

大家帮忙啊!!!
...全文
44 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
dyw 2002-04-26
  • 打赏
  • 举报
回复
可以完全不要.def文件!!!
dyw 2002-04-26
  • 打赏
  • 举报
回复
缺少extern "C" 声明吧!
在你的要倒出的DLL函数前添加:
extern "C"
theng 2002-04-26
  • 打赏
  • 举报
回复
多谢各位,特别是111222(www.mozilla.org),我用.def文件的办法解决了。
zbde00 2002-04-25
  • 打赏
  • 举报
回复
你的那个Set....函数的声明与定义,不要加WINAPI或者CALLBACK
然后再试试
111222 2002-04-25
  • 打赏
  • 举报
回复
如果未指定libname的路径,Visual Basic将按照下列顺序查找该文件:

  ①.exe文件所在的目录

  ②当前目录

  ③Windows系统目录

  ④Windows目录

  ⑤Path环境变量中的目录
111222 2002-04-25
  • 打赏
  • 举报
回复
C语言数据类型在VisualBasic中声明为调用时使用的表达式

   ATOM ByVal variable As Integer 结果为Integer 类型的表达式

   BOOL ByVal variable As Long 结果为 Long 类型的表达式

   BYTE ByVal variable As Byte 结果为 Byte 类型的表达式

   CHAR ByVal variable As Byte 结果为 Byte 类型的表达式

   COLORREF ByVal variable As Long 结果为 Long 类型的表达式

   DWORD ByVal variable As Long 结果为 Long 类型的表达式

   HWND, HDC, HMENU ByVal variable As Long 结果为 Long 类型的表达式等Windows 句柄

   INT, UINT ByVal variable As Long 结果为 Long 类型的表达式

   LONG ByVal variable As Long 结果为 Long 类型的表达式

   LPARAM ByVal variable As Long 结果为 Long 类型的表达式

   LPDWORD variable As Long 结果为 Long 类型的表达式

   LPINT, LPUINT variable As Long 结果为 Long 类型的表达式

   LPRECT variable As type 自定义类型的任意变量

   LPSTR, LPCSTR ByVal variable As String 结果为 String 类型的表达式

   LPVOID variable As Any 任何变量(在传递字符串的时候使用ByVal)

   LPWORD variable As Integer 结果为Integer 类型的表达式

   LRESULT ByVal variable As Long 结果为 Long 类型的表达式

   NULL As Any 或 ByVal Nothing 或

   ByVal variable As Long ByVal 0& 或 VBNullString

   SHORT ByVal variable As Integer 结果为Integer 类型的表达式

   VOID Sub procedure 不可用

   WORD ByVal variable As Integer 结果为Integer 类型的表达式

   WPARAM ByVal variable As Long 结果为 Long 类型的表达式

  5、VB中进行32位动态库的声明时,函数名是大小写敏感的。在获得了需要的动态连接 库之后,就可以在VB中进行调用了。但是,由于VB不能验证应用程序传递到动态连接库中的参 数值是否正确,因此VB程序中大量的API调用可能会降低整个应用程序的稳定性,也会增加以 后维护的难度。所以,决定在VB程序中直接调用API函数时要慎重,但适当的使用API调用确实 能够有效地提高VB程序的性能。这之间的平衡需要编程人员根据实际情况来掌握。下面就具体介绍一下在VB中调用API函数时需要做的工作。

  要声明一个DLL过程,首先需要在代码窗口的"通用(General)"部分增加一个Declare语句。如果该过程返回一个值,应将其声明为Function:

   Declare Function publicname Lib "libname" [Alias "alias"] [([[ByVal] variable [As type] [,[ByVal] variable [As type]]...])] As Type


   如果过程没有返回值,可将其声明为Sub:


   Declare Sub publicname Lib "libname" [Alias "alias"] [([[ByVal] variable [As type] [,[ByVal] variable [As type]]...])]


  缺省情况下,在标准模块中声明的DLL过程,可以在应用程序的任何地方调用它。在其它类型的模块中定义的DLL过程则是模块私有的,必须在它们前面声明Private关键字,以示区分。下面分别介绍声明语句的各个组成部分。

  (一)、指定动态库:

  Declare语句中的Lib子句用来告诉Visual Basic如何找到包含过程的.dll文件。 如果引用的过程属于Windows核心库(User32、Kernel32或GDI32),则可以不包含文件扩展名,如:

   Declare Function GetTickCount Lib "kernel32" Alias "GetTickCount" () As Long


   对于其它动态连接库,可以在Lib子句指定文件的路径:

   Declare Function lzCopy Lib "c:\windows\lzexpand.dll" _

   (ByVal S As Integer, ByVal D As Integer) As Long
111222 2002-04-25
  • 打赏
  • 举报
回复
作为一种32位Windows应用程序的开发工具,VB5生成的exe文件自然也都是32位的,通常情况下也只能调用32位的动态连接库。但是,并不是所有的32位动态库都能被VB生成的exe 文件正确地识别。一般来说,自己编写用于VB应用程序调用的动态连接库时,应注意以下几个方面的问题:

  1、生成动态库时要使用__stdcall调用约定,而不能使用缺省的__cdecl调用约定;__stdcall 约定通常用于32位API函数的调用。

  2、在VC5中的定义文件(.def)中,必须列出输出函数的函数名,以强制VC5系统将输出函数的装饰名(decoratedname)改成普通函数名;所谓装饰名是VC的编译器在编译过程中生成的输出函数名,它包含了用户定义的函数名、函数参数及函数所在的类等多方面的信息。由于在VC5中定义文件不是必需的,因此工程不包含定义文件时VC5就按自己的约定将用户定义的输出函数名修改成装饰名后放到输出函数列表中,这样的输出函数在VB生成的应用程序中是不能正确调用的(除非声明时使用Alias子句)。因此需要增加一个.def文件,其中列出用户需要的函数名,以强制VC5不按装饰名进行输出。

  3、VC5中的编译选项"结构成员对齐方式(structure member alignment)" 应设成4字节,其原因将在后文详细介绍。

  4、由于在C中整型变量是4个字节,而VB中的整型变量依然只有2个字节,因此在C中声 明的整型(int)变量在VB中调用时要声明为长整型(long),而C中的短整型(short)在VB中则 要声明成整型(integer);下表针对最常用的C语言数据类型列出了与之等价的Visual Basic 类型(用于32位版本的Windows)。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧