edisonx
发表于 2012-11-11 19:31:31
回复 15# netegg
不不不,在 Windows 作業系統下創建一個窗口時,
就必須先填入這個結構,這個結構名稱就叫 WNDCLASS ( 新版的是 WNDCLASSEX),
無論是哪種類型窗口類均如此 (除非直接調用 COM componment ,這部份機制就不熟,不多言) ,
再交由 RegisterWindow、CreateWindow / CreateWindowEx 、ShowWindow 執行,
若 netegg 先進有興趣,小弟有空可寫一段,純呼叫 gui32.dll API 之程序碼做為參考。
即便其他 script language 底層下也是間接去呼叫。
netegg
发表于 2012-11-11 19:38:19
本帖最后由 netegg 于 2012-11-11 19:39 编辑
回复 16# edisonx
找到现成的了,winapiex.au3里面有
Global Const $tagWNDCLASSEX = 'uint Size;uint Style;ptr hWndProc;int ClsExtra;int WndExtra;ptr hInstance;ptr hIcon;ptr hCursor;ptr hBackground;ptr MenuName;ptr ClassName;ptr hIconSm;'
edisonx
发表于 2012-11-11 19:44:03
回复 17# netegg
netegg 大抱歉,我手邊 AutoIt 竟沒有 WinAPIEx.au3,請教是否是我的版本不足呢?
最後,先謝謝您願意花那麼多時間與我討論 struct 之問題 :)
magusneo
发表于 2012-11-11 19:55:05
au3速度很慢,属于脚本语言里最慢的那档。基本上au3是1的话,lua是10倍,python5倍,ahk都2倍。
另外数据类型结构太单一,最简单的数组有时候做是能做,但工作量相比较其他大得多了。
seeyou
发表于 2012-11-11 21:48:16
本帖最后由 seeyou 于 2012-11-11 21:50 编辑
回复 18# edisonx
原理兄台是台湾同胞啊,你用的很多专业名词,我在侯捷的书上看到过。autoit的结构体用起来真的很复杂,我现在还不知道,如下的结构体在autoit中要怎么实现,
struct node
{
int id;
node * next;
};
那位替我解答一下,+30分。
edisonx
发表于 2012-11-11 22:18:16
回复 20# seeyou
這個單向鏈結 (Single Link) 確實還沒研究,試試先 :)
netegg
发表于 2012-11-11 22:31:21
本帖最后由 netegg 于 2012-11-11 22:33 编辑
#cs
; The IP_ADAPTER_INFO structure contains information about a particular network adapter on the local computer.
#define MAX_ADAPTER_DESCRIPTION_LENGTH128 // arb.
#define MAX_ADAPTER_NAME_LENGTH 256 // arb.
#define MAX_ADAPTER_ADDRESS_LENGTH 8 // arb.
typedef struct {
char String;
} IP_ADDRESS_STRING, IP_MASK_STRING;
typedef struct _IP_ADDR_STRING {
struct _IP_ADDR_STRING* Next;
IP_ADDRESS_STRING IpAddress;
IP_MASK_STRING IpMask;
DWORD Context;
} IP_ADDR_STRING
typedef struct _IP_ADAPTER_INFO {
struct _IP_ADAPTER_INFO* Next;
DWORD ComboIndex;
char AdapterName;
char Description;
UINT AddressLength;
BYTE Address;
DWORD Index;
UINT Type;
UINT DhcpEnabled;
PIP_ADDR_STRING CurrentIpAddress;
IP_ADDR_STRING IpAddressList;
IP_ADDR_STRING GatewayList;
IP_ADDR_STRING DhcpServer;
BOOL HaveWins;
IP_ADDR_STRING PrimaryWinsServer;
IP_ADDR_STRING SecondaryWinsServer;
time_t LeaseObtained;
time_t LeaseExpires;
} IP_ADAPTER_INFO,
*PIP_ADAPTER_INFO;
#ce
Const $ERROR_BUFFER_OVERFLOW = 111
; Struct IP_ADAPTER_INFO (single)
$Str_IPAdptInfo = "ptr;dword;char;char;uint;byte;dword;uint;uint;ptr;"
$Str_IPAdptInfo = $Str_IPAdptInfo & "ptr;char;char;dword;" ; IPAddressList
$Str_IPAdptInfo = $Str_IPAdptInfo & "ptr;char;char;dword;" ; GateWayList
$Str_IPAdptInfo = $Str_IPAdptInfo & "ptr;char;char;dword;" ; DhcpServer
$Str_IPAdptInfo = $Str_IPAdptInfo & "int;" ; HaveWins
$Str_IPAdptInfo = $Str_IPAdptInfo & "ptr;char;char;dword;" ; PrimaryWinsServer
$Str_IPAdptInfo = $Str_IPAdptInfo & "ptr;char;char;dword;" ; SecondaryWinsServer
$Str_IPAdptInfo = $Str_IPAdptInfo & "int;int"
类似这个?
edisonx
发表于 2012-11-11 22:31:32
本帖最后由 edisonx 于 2012-11-11 22:38 编辑
回复 20# seeyou
雛型約莫如此 < 沒正式做測試 >
$tagLink = "int;ptr"
Dim $Head = DllStructCreate ($tagLink)
Dim $Second = DllStructCreate ($tagLink)
DllStructSetData($Head, 1, 10)
DllStructSetData($Head, 2, DllStructGetPtr($Second) ) ;Head->Next = Second
DllStructSetData($Second, 1, 20)
DllStructSetData($Second, 2, 0) ;Second->Next = NULL
; ------------------------------------------------
ConsoleWrite( StringFormat("\nData Of Head : %d\n", DllStructGetData($Head, 1)))
ConsoleWrite( StringFormat("Next Of Head : 0X%08x\n\n", DllStructGetData($Head, 2)))
ConsoleWrite( StringFormat("Addr(Second) :0X%08x\n", DllStructGetPtr($Second)))
ConsoleWrite( StringFormat("Data Of Second : %d\n", DllStructGetData($Second, 1)))
ConsoleWrite( StringFormat("Next Of Second : 0X%08x\n\n", DllStructGetData($Second, 2)))
執行結果
Data Of Head : 10
Next Of Head : 0X01973590
Addr(Second) :0X01973590
Data Of Second : 20
Next Of Second : 0X00000000
如您所見,非常不便。欲做 PushFront、PushBack、Travel 需花點時間。
[補充] AU 之記憶體 (內存,memory) 管理都是自己來的,在裡頭用 link-list 意義似乎不大便是。
edisonx
发表于 2012-11-11 22:37:27
回复 22# netegg
小弟發文慢了,netegg 大給的例不錯,裡頭之 _IP_ADDR_STRING 即為單向鏈結之宣告一例,
seeyou
发表于 2012-11-11 23:52:09
回复 23# edisonx
我不懂的地方恰是你的例子里没有表现出来的,DllStructGetData($Head, 2)得到的是一个指针,如何用这个指针对象表达$Second呢?没有类似于解地址符*的函数,把地址变成一个对象。
@netegg,这个是哪里的例子,我要好好看看,或许能找到我要的答案。
netegg
发表于 2012-11-12 01:27:44
回复 25# seeyou
iphelper.au3
lxwlxwayy
发表于 2012-11-12 08:15:19
专业贴,看不懂呢
sango
发表于 2012-11-14 23:25:07
我觉得有2个:
1、图形界面没有集成编写代码,象其他一些语言的IDE界面一样,能对控件的事件编写代码就好了。
2、对非标准控件不能操作。
qtyscaicai
发表于 2012-11-15 15:34:18
AUTOIT 适合写小程序,快速执行的小东西。一般的功能都基本具备。但是多线程和无法编写BS架构的程序两个短板是天然的缺陷,只能作为开发工具有益的补充!
lxwlxwayy
发表于 2012-11-15 21:07:32
手枪和导弹,各有各的玩法,学习了