找回密码
 加入
搜索
楼主: cntxp

[AU3基础] autoit的不足主要有哪些?

 火... [复制链接]
发表于 2012-11-11 19:31:31 | 显示全部楼层
回复 15# netegg

不不不,在 Windows 作業系統下創建一個窗口時,
就必須先填入這個結構,這個結構名稱就叫 WNDCLASS ( 新版的是 WNDCLASSEX),
無論是哪種類型窗口類均如此 (除非直接調用 COM componment ,這部份機制就不熟,不多言) ,
再交由 RegisterWindow、CreateWindow / CreateWindowEx 、ShowWindow 執行,
若 netegg 先進有興趣,小弟有空可寫一段,純呼叫 gui32.dll API 之程序碼做為參考。

即便其他 script language 底層下也是間接去呼叫。
发表于 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;'
发表于 2012-11-11 19:44:03 | 显示全部楼层
回复 17# netegg


netegg 大抱歉,我手邊 AutoIt 竟沒有 WinAPIEx.au3,請教是否是我的版本不足呢?
最後,先謝謝您願意花那麼多時間與我討論 struct 之問題 :)
发表于 2012-11-11 19:55:05 | 显示全部楼层
au3速度很慢,属于脚本语言里最慢的那档。基本上au3是1的话,lua是10倍,python5倍,ahk都2倍。
另外数据类型结构太单一,最简单的数组有时候做是能做,但工作量相比较其他大得多了。
发表于 2012-11-11 21:48:16 | 显示全部楼层
本帖最后由 seeyou 于 2012-11-11 21:50 编辑

回复 18# edisonx


原理兄台是台湾同胞啊,你用的很多专业名词,我在侯捷的书上看到过。autoit的结构体用起来真的很复杂,我现在还不知道,如下的结构体在autoit中要怎么实现,
struct node
{
   int id;
   node * next;
};
那位替我解答一下,+30分。
发表于 2012-11-11 22:18:16 | 显示全部楼层
回复 20# seeyou


這個單向鏈結 (Single Link) 確實還沒研究,試試先 :)
发表于 2012-11-11 22:31:21 | 显示全部楼层
本帖最后由 netegg 于 2012-11-11 22:33 编辑

[au3]
        #cs
               
                ; The IP_ADAPTER_INFO structure contains information about a particular network adapter on the local computer.
               
                #define MAX_ADAPTER_DESCRIPTION_LENGTH  128 // arb.
                #define MAX_ADAPTER_NAME_LENGTH         256 // arb.
                #define MAX_ADAPTER_ADDRESS_LENGTH      8   // arb.
               
                typedef struct {
                char String[4 * 4];
                } 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[MAX_ADAPTER_NAME_LENGTH + 4];
                char Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4];
                UINT AddressLength;
                BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH];
                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[260];char[132];uint;byte[8];dword;uint;uint;ptr;"
        $Str_IPAdptInfo = $Str_IPAdptInfo & "ptr;char[16];char[16];dword;" ; IPAddressList
        $Str_IPAdptInfo = $Str_IPAdptInfo & "ptr;char[16];char[16];dword;" ; GateWayList
        $Str_IPAdptInfo = $Str_IPAdptInfo & "ptr;char[16];char[16];dword;" ; DhcpServer
        $Str_IPAdptInfo = $Str_IPAdptInfo & "int;" ; HaveWins
        $Str_IPAdptInfo = $Str_IPAdptInfo & "ptr;char[16];char[16];dword;" ; PrimaryWinsServer
        $Str_IPAdptInfo = $Str_IPAdptInfo & "ptr;char[16];char[16];dword;" ; SecondaryWinsServer
        $Str_IPAdptInfo = $Str_IPAdptInfo & "int;int"
[/au3]
类似这个?
发表于 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 意義似乎不大便是。
发表于 2012-11-11 22:37:27 | 显示全部楼层
回复 22# netegg

小弟發文慢了,netegg 大給的例不錯,裡頭之 _IP_ADDR_STRING 即為單向鏈結之宣告一例,
发表于 2012-11-11 23:52:09 | 显示全部楼层
回复 23# edisonx


    我不懂的地方恰是你的例子里没有表现出来的,DllStructGetData($Head, 2)得到的是一个指针,如何用这个指针对象表达$Second呢?没有类似于解地址符*的函数,把地址变成一个对象。

@netegg,这个是哪里的例子,我要好好看看,或许能找到我要的答案。
发表于 2012-11-12 01:27:44 | 显示全部楼层
回复 25# seeyou
iphelper.au3
发表于 2012-11-12 08:15:19 | 显示全部楼层
专业贴,看不懂呢
发表于 2012-11-14 23:25:07 | 显示全部楼层
我觉得有2个:
1、图形界面没有集成编写代码,象其他一些语言的IDE界面一样,能对控件的事件编写代码就好了。
2、对非标准控件不能操作。
发表于 2012-11-15 15:34:18 | 显示全部楼层
AUTOIT 适合写小程序,快速执行的小东西。一般的功能都基本具备。但是多线程和无法编写BS架构的程序两个短板是天然的缺陷,只能作为开发工具有益的补充!
发表于 2012-11-15 21:07:32 | 显示全部楼层
手枪和导弹,各有各的玩法,学习了
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-8 21:06 , Processed in 0.073638 second(s), 13 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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