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

手枪和导弹,各有各的玩法,学习了
页: 1 [2] 3
查看完整版本: autoit的不足主要有哪些?