TC官方合作论坛

 找回密码
 立即注册
查看: 1692|回复: 4

第七法,api的调用方法。实战GetComputerName()

[复制链接]
发表于 2017-5-12 19:03:54 来自手机 | 显示全部楼层 |阅读模式

马上加入TC

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
第七法,api的调用方法。实战GetComputerName()
.
第一步:信息收集。获取计算机名字
论坛 > 新手专区
[已解决]使用TC,可以获取计算机名称么?
楼主 yhmjh 发消息
如题,因为在域网络,同一台电脑可能有多个用户使用,需要判定计算机名称,根据不同的计算机名称,做出不同的操作,求高手指点一下,谢谢
回复
//
VB6.0获取计算机名,用户名的方法,
在做项目的时候,做学生信息管理系统啦,经常会用到这个。收集汇总一下,将来可能会用到。
//
当你在一个大公司里面,当一个网络管理员时,发现成千上万个电脑需要你去管理时,怎么去区分这些电脑呢?那肯定是通过计算机的名称。
或者其它公司的网络管理员,又需要你开发一套软件,它可以把所有电脑的名称自动地上报给他。面对这样的需求,就可以使用下面的函数GetComputerName来获取计算机的名称,并通过网络传送给管理员。
//
VC++ 获得计算机名和用户名
GetComputerName GetUserName
发表于2013/3/11 15:09:58  15540人阅读
分类: Windows编程
       在CSDN论坛上看到有帖子在问如何获得计算机名称及用户名。
这个其实非常简单。二个函数——GetComputerName和GetUserName就搞定了。其函数原型如下:
一.GetComputerName
//By MoreWindows-(http://blog.csdn.net/MoreWindows)
BOOLWINAPI GetComputerName(
    __out         LPTSTRlpBuffer,
    __in_out      LPDWORDlpnSize
);
二.GetUserName
//By MoreWindows-(http://blog.csdn.net/MoreWindows)
BOOLWINAPI GetUserName(
    __out         LPTSTRlpBuffer,
    __in_out      LPDWORDlpnSize
);
//
沙发 yhmjh 发消息
已经通过 用户目录=系统获取系统路径(4),达到相应效果了
回复
5# 武昌剩竹 发消息
请参考
http://bbs.tyuyan.net/thread-65602-1-1.html
回复
=======================================================
系统API。GetComputerName()
搜狗百科
VB版本 [声​明]
Declare Function GetComputerName Lib"kernel32"Alias"GetComputerNameA"(ByVal lpBuffer As String, nSize As Long) As Long
[说明]
取得这台计算机的名称
.
[参数表]
lpBuffer ------- String,随同计算机名载入的字串缓冲区。Buffer,翻译为缓冲区。
nSize ---------- Long,缓冲区的长度。先设置长度。这个变量,随同返回计算机名的实际长度载入。
.
[返回值]
Long,TRUE(非零)表示成功,否则返回零。会设置GetLastError
[其它]
也许你会发现,
MAX_COMPUTERNAME_LENGTH常数在vb自带的api文本查看器中找不到。我也没有找到。但我有一个工具:Listapi。
这个常数在它那里可以找到。
=======================================================
查下MSDN。
BOOL WINAPI GetComputerName(
__out LPTSTR lpBuffer,
__in,out LPDWORD lpnSize
);
功能:
从注册表中 检索本地计算机的NetBIOS名称
参数
lpBuffer [out]
指向一块内存缓冲区,这个缓冲区用于接收计算机名称或群集的虚拟服务器名称。缓冲区的大小应该足够大,以便能够容纳MAX_COMPUTERNAME_LENGTH + 1个字符。
lpnSize [in, out]
在输入时,指定的缓冲区的大小,这个大小是按照TCHAR计算的。
在输出的时候,字符的长度不包括终止空字符\0。
如果缓冲区太小,该函数将失败,调用GetLastError返回ERROR_BUFFER_OVERFLOW。
.
返回值
如果函数成功,返回值是一个非零值。
如果函数失败,返回值是零。为了获得更多错误信息,请调用 GetLastError函数 。
=======================================================
回复

使用道具 举报

 楼主| 发表于 2017-5-12 19:05:30 来自手机 | 显示全部楼层

第二步:知识准备。函数定义行的约定。
♡い** :
简单理解,byval传值,byref是传地址。
VB函数定义行的byref,类似 TC函数定义行的 &,都用来标识传址。
=======================================================
VB约定:在函数定义行中,
ByVal 是普通传参,传值的。in
ByRef 是引用传参,传址的。in,out
.
不标识ByRef,ByVal的变量,VB默认为传址。in,out
关键字ByVal,后面跟有lp的变量,VB默认为传址。in,out
.
Val是英文Value的缩写,Ref是英文Refer的的缩写。 in,out,又称为引用返回。
=======================================================

对传址、传值的解释:
在函数定义行中,
VB传参的方式有两种:按地址传递,按值传递。
.
主函数调用子函数,
按值传参数时,传递的只是这个变量的副本。如果子函数改变了副本,所作变动只影响副本,不会影响主函数变量的本身。
.
主函数调用子函数,
按地址传参数时,子函数可以通过变量的内存地址,去访问变量的内容。这样,子函数可以改变变量的值。
visual Basic中缺省的传参方式,是按地址传递参数。所以在缺省的情况下,子函数被调用之后,参数的内容可能已经改变。
根据这一特性,对于不带返回值的子函数,可以把返回结果 保存在传递的参数中。
//
在函数的定义行中,
Byref:缺省方式,按地址传递。
例如主函数A  调用子函数B,按地址传递变量intc作为参数。
传递后B在执行过程中 改变intc的值,A中intc的值 也将改变为B执行后的值。
.
Byval:按值传递。
例如主函数A 调用子函数B,按值传递变量intc作为参数,传递后不管B在执行过程中是否改变intc的值,A中intc的值 始终保持调用B之前的值。A中intc的值不变。
//
传址是把一个存放数据的内存地址,传递给函数或过程。传值是把一个数值的副本,传递给函数或过程。
VB默认的方式是传址,关键字 ByRef 可以省略。
//
对lp的解释:
l是英文long的缩写,代表通用类型。
p是英文point的缩写,代表指向的,指针类型的。
小写字母lp,标识该参数是传址类型。
.
WIN32_API的参数类型。WIN32传址类型的参数,
都对应tc_dllcall的p类型参数。必须使用带p开头的。
=======================================================
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-5-12 19:08:08 来自手机 | 显示全部楼层

第三步:GetComputerNameW 调用实战。
在tc中,系统API的调用格式:
dllcall("dll路径","返回值类型","函数名",
"参数类型",参数名, "…",…)
调用系统dll,省略dll路径。调用第三方的dll,必须带路径。
"dll路径":"kernel32.dll"
"返回值类型":"long"
"函数名":"GetComputerNameW"

看看参数1,参数2应该怎样写。
__out LPTSTR lpBuffer,
__in,out LPDWORD lpnSize
lpBuffer是获取电脑名称的缓冲区。英文单词Buffer,缓冲区。
nSize是输入缓冲区的大小 和输出电脑名称的大小。
.
参数1 out是返回字符串的。LP是引用。这样是引用返回。
标识字符串的引用返回,使用"pwchar *"
参数2 是用来标识参数1 缓冲区的长度。
参数2 是先in后out的。先传入最大的参数,再根据参数1 保存计算机名的长度,引用返回参数。
=======================================================

运行VS2013,热键F1_弹出帮助文档。
帮助文档就是MSDN。在百度搜索,同样有在线的MSDN。
BOOL WINAPI GetComputerName(
__out LPTSTR lpBuffer,
__in,out LPDWORD lpnSize
);
———————————————————————
运行tc,热键F1_弹出帮助文档。
3.windows平台,6.dllcall,1_dllcall的使用说明
———————————————————————
WIN32中的参数类型 LPTSTR,
对应 tc_dllcall,pwchar *
WIN32中的参数类型 LPDWORD,
对应 tc_dllcall,plong
对照MSDN 和TC帮助文档的说明,套着用就行。
//
var bool_va, lpBuffer="",nSize=128
bool_va = dllcall("kernel32.dll","long","GetComputerNameW", "pwchar *",lpBuffer, "plong",nSize)
traceprint(bool_va)
traceprint(lpBuffer)
traceprint(nSize) //经过引用返回,128变成15了。调用 GetUserName(),方法类似。
//
tc大成群:433286131
本贴记录在:tc简单开发吧,精品区2,编程八**。
=======================================================
重点:
WIN32_API的参数类型。WIN32传址类型的参数,
都对应tc_dllcall的p类型参数。必须使用带p开头的。

回复 支持 反对

使用道具 举报

发表于 2017-5-13 21:46:00 | 显示全部楼层
怎么 获取 文件的图标?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-5-14 18:54:34 来自手机 | 显示全部楼层
pengtusheng 发表于 2017-5-13 21:46
怎么 获取 文件的图标?

这种高级的东西,楼主也不懂。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条

关闭

小黑屋|TC官方合作论坛 (苏ICP备18045623号)

GMT+8, 2024-9-30 19:02 , Processed in 0.036023 second(s), 22 queries .

Powered by 海安简单软件服务部

© 2008-2019 版权所有 保留所有权利

快速回复 返回顶部 返回列表