DLL命令lstrcpyn

 时间:2024-11-12 05:17:16

爱空空情空空,自己流浪在街中;人空空钱空空,单身苦命在打工;事空空业空空,想来想去就发疯;碗空空盆空空,生活所迫不轻松。总之,四大皆空!好诗好诗!

工具/原料

易语言中出于安全、方便考虑,没有直接提供指针

这在进行一些高级操作时不是很方便,虽然有一些第三方支持库可以取

方法/步骤

1、变量指针:但是仅仅为了这个操作就带上一个支持库不太值得。其实用一个API,加上一些技巧就可以欺骗Windows和易语言,让它们告诉你一个变量的指针。这个API是lstrcpyn。用过C开发Windows下的程序的朋友可能对这个API比较熟悉,就是字符串拷贝。在windows下取代C标准库函数strncpy的。字符串拷贝怎么能取得变量指针呢?秘密就在这个API的返回值:看看MSDN:“Ifthefunctionsucceeds,thereturnvalueisapointertothebuffer”该函数把第二个参数指定的字符串复制到第一个参数指定的字符串,第三个参数指定复制的长度。如果复制成功,返回第一个参数(缓冲区buffer)的地址。看到了吗?它返回第一个参数的地址!!那么我们把需要取地址的变量给它的第一个参数,然后想办法让它复制成功,它不就返回了那个变量的地址了吗?定义一个DLL命令如下:Dll命令:取文本指针返回值类型:整数型在Dll库中的命令名:lstrcpyn参数:欲取其指针的文本数据类型:文本型<传址>参数:欲取其指针的文本数据类型:文本型<传址>参数:保留数据类型:整数型备注:0

2、这样调用:文本1=“abcdefg”指针1=取文本指针(文本1,文本1,0)把文本1复制到自身,复制长度为0字节(也就是什么都不复制),然后返回文本1的指针。就这么简单。先告诉Windows我要复制一个文本到某个内存地址,但同时告诉它我什么都不复制,它实际上帮你取出了这个文本的指针。上面的例子是取文本的指针,其他类型的变量也一样的,因为在API内部(其实是在内存中)什么类型的变量都表现为一块内存区域,原理是一样的。但是易语言是强制类型的语言,所以这次要骗骗易语言了,呵呵,再定义这个API的一个新版本,把它的参数定义成你想要的类型就可以了。Dll命令:取整数指针返回值类型:整数型在Dll库中的命令名:lstrcpyn参数:欲取其指针的整数数据类型:整数型<传址>备注:一定要传址参数:欲取其指针的整数数据类型:整数型<传址>备注:一定要传址.重复一次参数:保留数据类型:整数型备注:0

3、2,特殊的结构用字节集代替Window98及其后的操作系统提供了一个非常棒的API:GradientFill,利用这个API可以方便地画出渐变的效果。这个API倒不是很麻烦,参考MSDN我们很快就可以在易语言中定义出这个DLL命令:(以渐变填充矩形为例)Dll命令:GradientFill返回值类型:逻辑型Dll库文件名:Msimg32.dll在Dll库中的命令名:GradientFill参数:hDC数据类型:整数型参数:pVertex数据类型:TRIVERTEX参数:dwNumVertex数据类型:整数型参数:pMesh数据类型:GRADIENT_RECT参数:dwNumMesh数据类型:整数型参数:dwMode数据类型:整数型其中TRIVERTEX和GRADIENT_RECT时自定义的数据类型:

4、自定义数据类型:TRIVERTEX成员:x数据类型:整数型成员:y数据类型:整墙绅褡孛数型成员:伊怕锱鳏Red数据类型:短整数型成员:Green数据类型:短整数型成员:Blue数据类型:短整数型成员:Alpha数据类型:短整数型自定义数据类型:GRADIENT_RECT成员:UpperLeft数据类型:整数型成员:LowerRight数据类型:整数型根据MSDN的说明,根本没有问题,但是如果你调用这个函数,你不会成功的。为什么?我告诉你原因在TRIVERTEX的定义上。你也许会说,这个没有问题啊,MSDN上定义如下:typedefstruct_TRIVERTEX{LONGx;Longy;COLOR16Red;COLOR16Green;COLOR16Blue;COLOR16Alpha;}TRIVERTEX,*PTRIVERTEX;C语言的LONG和Long在Windows32位下是32位,对应于易语言“整数型”,COLOR16为十六位,对应于易语言的“短整数型”没有问题啊!那如果我再告诉你,易语言中的自定义数据类型的成员均是四字节对齐的,你该理解了吧。是的,易语言中的自定义数据类型的成员均是四字节对齐的,如果不足四字节,会自动对齐到四字节的。具体到上面的定义,Red,Green,Blue,Alpha虽然被定义为“短整数型”但是在易语言内部,它们均被扩充为“整数型”了。这就是问题的根源。解决的办法就是用字节集代替自定义数据结构。易语言的字节集不存在四字节对齐的问题。

5、Dll命令:GradientFill返回值亿姣灵秀类型:逻辑型Dll库文件名:Msimg32.dll在Dll库中的命令名:GradientFill参数:hDC数据类型:整数型参数:pVe鸡堕樱陨rtex数据类型:字节集……………………..这样定义就可以了。为了方便地生产所需要的字节集数据,我有定义了一个子程序:子程序:TRIVERTEX到字节集返回值类型:字节集备注:由于内存对齐的原因,必须把TRIVERTEX类型转换为字节集才可以调用API成功参数:VertEX数据类型:TRIVERTEX<数组>局部变量:元素个数数据类型:整数型局部变量:变量数据类型:整数型局部变量:数据数据类型:字节集元素个数=取数组成员数(VertEX)计次循环首(元素个数,变量)数据=数据+到字节集(VertEX[变量].x)数据=数据+到字节集(VertEX[变量].y)数据=数据+到字节集(VertEX[变量].Red)数据=数据+到字节集(VertEX[变量].Green)数据=数据+到字节集(VertEX[变量].Blue)数据=数据+到字节集(VertEX[变量].Alpha)计次循环尾()返回(数据)

Eclipse RCP javaFx 运行报错 解决方案 PT_超级狮子游戏介绍 永恒之塔守护新军装如何打魔石 如何写述职转正PPT 青蛙怎么过冬
热门搜索
麻疹的症状图片 限制级电影 唯美小清新图片 电加热器图片 胡慧中图片