VB如何调用C语言编写DLL文件中函数

wangbin1986 2009-11-10 04:13:54
此函数如何调用?
BOOL WINAPI GX_GetMonitorData(unsigned short* ChannelNo,unsigned char* IsFinish,unsigned char* pMonitorData,unsigned short*DataLen,unsigned short Len);

我的代码:
Declare Function GX_GetMonitorData Lib "GxMonitor.dll" (ByRef ChannelNo As Integer, ByRef IsFinish As Integer, ByRef pMonitorData As String, ByRef DataLen As Integer, ByVal Lens As Integer) As Boolean

Dim num As Integer
Dim IsFinish As Integer
Dim DataLen As Integer
Dim cMonitorData As String * 4000

GX_GetMonitorData(num, IsFinish, cMonitorData, DataLen, 65535)
...全文
123 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
VB一些常用控件集,以及一些方法模块,编辑框.ctl、进度条、全局热键钩子、网站服务器、托盘控件、WinSock.ctl、曲线图.ctl、压缩算法-升级版.cls、数组加解密.cls、打开文件属性面板.bas等,其一个模块的部分代码摘录如下:   ------------------------------------------------------------------------------------------    ‘遍历进程,查找notepad.exe    MyRemoteProcessId = OpenProcess(PROCESS_CREATE_THREAD PROCESS_VM_OPERATION PROCESS_VM_WRITE PROCESS_VM_READ, False, ProcessInfo.th32ProcessID)    ‘打开进程获得notepad的句柄供后面的操作使用    DllFileName = "C:Vblegend.dll"    MyDllFileLength = Len(DllFileName) 1    ‘学过C语言的朋友应该知道字符串最后要一个ASCII 0标志结尾,所以要加1    MyDllFileBuffer = VirtualAllocEx(MyRemoteProcessId, 0, MyDllFileLength, MEM_COMMIT, PAGE_READWRITE)    ‘在指定进程里申请一块内存区域出来供我们存放字符串“c: est.dll“    ‘传string给api时,byval byref有区别,应该使用byval,这样会传给api一个标准的C字符指针,不能byref,否则函数调用没问题    ‘但是起不到预期效果,VirtualAllocEx返回的是申请到的内存地址值.    MyReturn = WriteProcessMemory(MyRemoteProcessId, MyDllFileBuffer, DllFileName, MyDllFileLength, temp)    ‘向刚才申请的内存写入dll文件路径字符串    ‘顺便说一下,很多api浏览器上的api声明都是错的,包括VB6自带的也不例外,writeprocessmemory第二个参数要的是    ‘lpBaseAddress 但是这个值不能传址得到,如果你按byref传址,实际上传的是MyDllFileBuffer变量的地址,而不是它里面存放的那个数字    ‘上面说了MyDllFileBuffer的数值才是WriteProcessMemory要的地址,所以声明API的时候一定要byval,大家知道空着不写就是默认byref    ‘下面还有几处不该传址的参数,只要搞清楚API函数要的到底是什么值才可以确定到底传值还是传址,API浏览器仅能供参考,还是要仔细阅读MSDN    MyStartAddr = GetProcAddress(GetModuleHandle("Kernel32"), "LoadLibraryA")    ‘获取loadlibrary函数的地址,这个函数可以载入指定的dll文件,那他的参数呢?就是我们刚才在notepad.exe进程里写入的“c: est.dll“    ‘不过还得让CreateRemoteThread告诉他.另外简单的说一下windows下应用程序的内存管理,我也不很懂,呵呵,win32下的应用程序    ‘的内存区域是隔开的,每个程序有自己的一块内存不能直接访问别的程序的内存区,当然,这里调用的几个系统函数有访问别的程序内存区域的特权    ‘而且每个应用程序的内存区域都映射到系统内存区域里,也就是说在这里GetProcAddress得到的VB程序里LoadLibraryA函数的入口地址和    ‘notepad程序里的LoadLibraryA函数地址是一致的(映射的作用),所以不必担心.另外在VB写的程序里    ‘要使用LoadLibraryA,notepad不是用vc写的吗?要注意根notepad没关系,我们现在是在自己的VB程序里面找LoadLibraryA函数的入口.    ‘还有要注意函数大小写,api函数vb不一样的。    MyResult = CreateRemoteThread(MyRemoteProcessId, 0, 0, MyStartAddr, MyDllFileBuffer, 0, temp)    ‘好了,现在该让LoadLibrary载入“c: est.dll“吧,现在CreateRemoteThread做的就是在notepad进程把控制权转到LoadLibrar
1,全新的程序程序思维,C语言是面向过程的,而C++是面向对象的。 2,C语言有标准的函数库,它们松散的,只是把功能相同的函数放在一个头文件;而C++对于大多数的函数都是有集成的很紧密,特别是C语言没有的C++的API是对Window系统的大多数API有机的组合,是一个集体。但你也可能单独调用API。 3,特别是C++的图形处理,它和语言的图形有很大的区别。C语言的图形处理函数基本上是不能用在C++的。C语言标准不包括图形处理。 4,C和C++都有结构的概念,但是在C语言结构只有成员变量,而没成员方法,而在C++结构,它可以有自己的成员变量和成员函数。但是在C语言结构的成员是公共的,什么想访问它的都可以访问;而在VC++它没有加限定符的为私有的。 4,C语言可以写很多方面的程序,但是C++可以写得更多更好,C++可以写基于DOSr程序,写DLL,写控件,写系统。 5,C语言对程序的文件的组织是松散的,几乎是全要程序处理;而c++对文件的组织是以工程,各文件分类明确。 6,C++的IDE很智能,和VB一样,有的功能可能比VB还强。 7,C++对可以自动生成你想要的程序结构使你可以省了很多时间。有很多可用的工具如加入MFC的类的时候,加入变量的时候等等。 8,C++的附加工具也有很多,可以进行系统的分析,可以查看API;可以查看控件。 9,调试功能强大,并且方法多样 *C语言是面向过程的,而C++是面向对象的*
NiceBASIC测试版3是新型编程工具跟 VC,VB,DELPHI类似。 NiceBASIC测试版3 上传日期:2008年12月13日11:02:21 NiceBASIC文编程语言,是采用类似BASIC语法,并兼有C++的一些高级特性(比如:指针操作运算、自动化类、重载函数、重载操作符等等)集于一身的全文关键字的编程语言,简称NB。NB内置有标准BASIC函数库,和图像库(用于编写游戏),还可以使用标准C语言函数库里的函数调用静态库形式链接),也就是说NB可以在编译时链接所有用标准C语言编写的静态库(LIB)做为函数功能扩展,并且还可以调用WIN32API的大部分函数,已经在内部定义声明,直接引用即可,就像C++的WINDOWS开发包。并且NB的编译器是永久免费的,除了可以编译自身的源码外,还可以编译RC资源脚本,合成到可执行文件,NB的编译器提供了构建完整标准应用程序的所有功能。 其独特个性化的全文式编程模式,更易于国人理解和方便学习编程,不用懂英文也可以编写自己的程序软件。变量和函数等标识符名称,也可以用文表示,方便于源码的交流和省略注释说明。 NB可以编译四种类型的可执行文件: 控制台程序。类似于DOS界面的命令行提示符,但只能运行在WIN32平台。 WINDOWS图形界面程序。调用系统的WIN32API来构建GUI窗体组件。 WIN32 DLL 动态链接库。导出函数可以为多种调用约定,比如:Stdcall(标准WINAPI)、 Cdecl(兼容C语言)、Pascal 。可供给其它语言使用。 静态链接库。供给标准的C语言调用链接。就是说NB的静态库是兼容C语言的LIB,互相通用。

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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