以文本方式查看主题
- 金字塔客服中心 - 专业程序化交易软件提供商 (http://weistock.com/bbs/index.asp)
-- 高级功能研发区 (http://weistock.com/bbs/list.asp?boardid=5)
---- [求助]请问这两个API的DynamicWrapper输入参数数量和类型该怎么写 (http://weistock.com/bbs/dispbbs.asp?boardid=5&id=10836)
|
-- 作者:testware
-- 发布时间:2012/3/30 8:43:28
-- [求助]请问这两个API的DynamicWrapper输入参数数量和类型该怎么写
在VB是这么写的:
Private
Declare
Sub CopyMemory Lib
"ntdll"
Alias
"RtlMoveMemory" (Destination As
Any, Source As
Any, ByVal Length As
Long)
Private
Declare
Function StrCSpn Lib
"shlwapi.dll"
Alias
"StrCSpnW" (ByVal lpStr&, ByVal lpCharacters&) As
Long
谢谢!!
|
-- 作者:admin
-- 发布时间:2012/3/30 9:46:01
--
建议看看金字塔编程帮助中对DynamicWrapper的参数描述吧,此外DynamicWrapper是公用的控件,你可以到GOOGLE上搜索一下看看有没有能帮助到你的信息
|
-- 作者:testware
-- 发布时间:2012/3/30 17:50:13
--
我看过帮助了 主要是Any类型不知道怎么转换 查了一下,是变体
|
-- 作者:王锋
-- 发布时间:2012/3/30 18:00:35
--
到网上一艘一大把
给你找了一篇 VBS调用Win32API示例:对话框
里面有相关累死的代码调用
Option Explicit \'************************************ \'* Sample GUI only with API calls * \'* Need DynaWrap component * \'* Use Struct v1.1 Class * \'* syntax Win NT et > * \'* omen999 february 2007 * \'************************************
Class Struct \' v1.1 allow typedef with dynawrap calls Public Property Get Ptr \'******************************* Property Ptr Ptr=GetBSTRPtr(sBuf) End Property Public Sub Add(sItem,sType,Data) \'********************** Method Add Dim lVSize,iA,iB,iD iA=InStr(1,sType,"[",1) iB=InStr(1,sType,"]",1) iD="0" If iA>0 And iB>0 Then iD=Mid(sType,iA+1,iB-iA-1) If isNumeric(iD) Then sType=Left(sType,iA-1) Else Err.raise 10000,"Method Add","The index " & iD & " must be numeric" Exit Sub End If End If Select Case UCase(sType)\'************************************************* COMPLETE WITH OTHERS WIN32 TYPES \'OS 32bits... Case "DWORD","LONG","WPARAM","LPARAM","POINTX","POINTY","ULONG","HANDLE","HWND","HINSTANCE","HDC","WNDPROC","HICON","HCURSOR","HBRUSH" lVSize=4 Case "LPBYTE","LPCTSTR","LPSTR","LPPRINTHOOKPROC","LPSETUPHOOKPROC","LPVOID","INT","UINT" lVSize=4 Case "WORD" lVSize=2 Case "BYTE" lVSize=1 Case "TCHAR" If CLng(iD)<1 Then lVSize="254" Else lVSize=iD Case Else Err.raise 10000,"Method Add","The type " & sType & " is not a Win32 type." Exit Sub End Select dBuf.Add sItem,lVSize sBuf=sBuf & String(lVSize/2+1,Chr(0)) SetDataBSTR GetBSTRPtr(sBuf),lVSize,Data,iOffset End Sub Public Function GetItem(sItem) \'********************************************** Méthode GetItem Dim lOf,lSi,aItems,aKeys,i If dBuf.Exists(sItem) then lSi=CLng(dBuf.Item(sItem)) aKeys=dBuf.Keys aItems=dBuf.Items lOf=0 For i=0 To dBuf.Count-1 If aKeys(i)=sItem Then Exit For lOf=lOf+aItems(i) Next GetItem=GetDataBSTR(Ptr,lSi,lOf) Else GetItem="" err.raise 10000,"Method GetItem","The item " & sItem & " don\'t exist" End If End Function Public Function GetBSTRPtr(ByRef sData) \'retun the TRUE address (variant long) of the sData string BSTR Dim pSource Dim pDest If VarType(sData)<>vbString Then \'little check GetBSTRPtr=0 err.raise 10000, "GetBSTRPtr", "The variable is not a string" Exit Function End If pSource=oSCat.lstrcat(sData,"") \'trick to return sData pointer pDest=oSCat.lstrcat(GetBSTRPtr,"") \'idem GetBSTRPtr=CLng(0) \'cast function variable \'l\'adresse du contenu réel de sBuf (4octets) écrase le contenu de la variable GetBSTPtr \'les valeurs sont incrémentées de 8 octets pour tenir compte du Type Descriptor oMM.RtlMovememory pDest+8,pSource+8,4 End Function \'**************************************************************************** IMPLEMENTATION Private oMM,oSCat,oAnWi \'objets wrapper API Private dBuf,sBuf,iOffset Private Sub Class_Initialize \'Constructeur Set oMM=CreateObject("DynamicWrapper") oMM.Register "kernel32.dll","RtlMoveMemory","f=s","i=lll","r=l" Set oSCat=CreateObject("DynamicWrapper") oSCat.Register "kernel32.dll","lstrcat","f=s","i=ws","r=l" Set oAnWi=CreateObject("DynamicWrapper") oAnWi.Register "kernel32.dll","MultiByteToWideChar","f=s","i=llllll","r=l" Set dBuf=CreateObject("Scripting.Dictionary") sBuf="" iOffset=0 End Sub Private Sub SetDataBSTR(lpData,iSize,Data,ByRef iOfs) \'Place une valeur Data de taille iSize à l\'adresse lpData+iOfs Dim lW,hW,xBuf Select Case iSize \'on commence par formater les valeurs numériques Case 1 lW=Data mod 256 \'formatage 8 bits xBuf=ChrB(lW) Case 2 \'if any lW=Data mod 65536 \'formatage 16 bits xBuf=ChrW(lW) \'formatage little-endian Case 4 hW=Fix(Data/65536)\'high word lW=Data mod 65536 \'low word xBuf=ChrW(lW) & ChrW(hW) \'formatage little-endian Case Else \'bytes array, size iSize xBuf=Data End Select oMM.RtlMovememory lpData+iOfs,GetBSTRPtr(xBuf),iSize iOfs=iOfs+iSize \'maj l\'offset End Sub Private Function GetDataBSTR(lpData,iSize,iOffset) \'Read an iSize data to lpData+iOffset address Const CP_ACP=0 \'code ANSI Dim pDest,tdOffset \'valeurs pour les données numériques pDest=oSCat.lstrcat(GetDataBSTR,"") tdOffset=8 Select Case iSize \' cast de la variable fonction Case 1 GetDataBSTR=CByte(0) Case 2 GetDataBSTR=CInt(0) Case 4 GetDataBSTR=CLng(0) Case Else \'a little bit more complicated with string data... GetDataBSTR=String(iSize/2,Chr(0)) \'la chaine variant BSTR stocke ses données ailleurs pDest=GetBSTRPtr(GetDataBSTR) tdOffset=0 End Select \'le contenu de la structure à l\'offset iOffset écrase le contenu de la variable GetDataBSTR (tenir compte du TD) oMM.RtlMovememory pDest+tdOffset,lpData+iOffset,iSize if tdOffset=0 Then oAnWi.MultiByteToWideChar CP_ACP,0,lpData+iOffset,-1,pDest,iSize \'don\'t forget conversion Ansi->Wide GetDataBSTR=Replace(GetDataBSTR,Chr(0),"") \'clean the trailer End If End Function End Class
|
-- 作者:王锋
-- 发布时间:2012/3/30 18:01:41
--
Class XGui \'v1.0 \' this class create a dialogbox only by api calls \' it uses automation component DynaWrap and the struct class upper to allow typedef with dynawrap calls \' 4 public methods: CreateForm, ShowForm, RunForm et AddControl \' 1 public object dictionnary dFrmData which keys are name controls and stores data controls \' edit, static et button controls return content, listbox/combobox the selected item if exists, or empty string \' radiobutton and checkbox return true if checked or false \' groupbox control always return false \' each control must have unique name \' if the last letter of a checkbox ou radiobutton control name is "k", the control wil be checked \' close form without dictionnary data with esc key, Alt+F4, close button and system menu \' button controls haven\'t default behavior et must be manage by RunForm method \' this release 1.0 manages only "&ok" et "&cancel" buttons \' button ok closes the form and set data dictionnary, button cancel acts like esc key
Public dFrmData \' object dictionnary Public Sub CreateForm(sCaption,lLeft,lTop,lWidth,lHeight,bOnTaskBar) \'Create a modeless invisible form \'sCaption: form caption \'lLeft,lTop: coordinates form \'lWidth, lHeight: form dimensions \'bOnTaskBar: if true (-1) form is display on taskbar \'no return value
Const WS_VISIBLE=&H10000000 Const WS_POPUP=&H80000000 Const WS_OVERLAPPEDWINDOW=&HCF0000 Dim hTask,fChild If bOnTaskBar Then hTask=0 fChild=0 Else hTask=hWsh fChild=WS_CHILD End If hWF=oWGui.CreateWindowExA(0,"#32770",sCaption&"",WS_OVERLAPPEDWINDOW+WS_POPUP+fChild,lLeft,lTop,lWidth,lHeight,hTask,0,hIns,0) End Sub Public Sub ShowForm(bAlwaysOnTop) \'display the form created by CreateForm \'bAlwaysOnTop: if true (-1) form always on top \'no return value
Const HWND_TOP=0 Const HWND_TOPMOST=-1 Const SWP_SHOWWINDOW=&H40 Const SWP_NOMOVE=&H2 Const SWP_NOSIZE=&H1 Dim fTop If bAlwaysOnTop Then fTop=HWND_TOPMOST Else fTop=HWND_TOP oWGui.SetWindowPos hWF,fTop,0,0,0,0,SWP_SHOWWINDOW+SWP_NOMOVE+SWP_NOSIZE End Sub Public Sub RunForm() \'form messages pump and dictionnary gestion \'no return value
Const WM_COMMAND=&H111 Const WM_SYSCOMMAND=&H112 Const WM_KEYUP=&H101 Const WM_LBUTTONUP=&H202 Const GCW_ATOM=-32 Const LB_GETCURSEL=&H188 Const LB_ERR=-1 Const LB_GETTEXT=&H189 Const LB_GETTEXTLEN=&H18A Const GWL_STYLE=-16 Const WS_CHILD=&H40000000 Const WS_VISIBLE=&H10000000 Const WS_TABSTOP=&H10000 Const BS_AUTOCHECKBOX=&H3 Const BS_AUTORADIOBUTTON=&H9 Const BM_GETCHECK=&HF0 Const BST_UNCHECKED=&H0 Const BST_CHECKED=&H1 Const BST_INDETERMINATE=&H2 Const BST_PUSHED=&H4 Const BST_FOCUS=&H8 Const CP_ACP=0 Const GWL_ID=-12 Dim sCN,sCNW \'control content ansi/wide Dim aKData,aHData \'dictionnary contents keys/datas Dim lGetI \'index selected item (listbox) Dim lStyle \'button style Dim lKCode \'param message Dim n \'compteur
|
-- 作者:王锋
-- 发布时间:2012/3/30 18:02:24
--
Do While oWGui.GetMessageA(MSG.Ptr,hWF,0,0)>0 \'Main loop messages pump If oWGui.IsDialogMessageA(hWF,MSG.ptr)<>0 Then Select Case MSG.GetItem("message") Case WM_KEYUP,WM_LBUTTONUP lKCode=MSG.GetItem("wParam") If MSG.GetItem("message")=WM_LBUTTONUP Then lKCode=13 \'left mouse click -> enterkey Select Case lKCode Case 27 \'esc dFrmData.RemoveAll oWGui.DestroyWindow hWF Exit Do Case 13,32 \'enter or space when is an button control If oWGui.GetClassLongA(oWGui.GetFocus,GCW_ATOM)=49175 Then \'get atom button sCNW=UCase(GetBSTRCtrl(oWGui.GetFocus)) If sCNW="&OK" Then \'it\'s ok button, so set dictionnary data and form close aKData=dFrmData.Keys \'control names array aHData=dFrmData.Items \'control handles array For n=0 To dFrmData.Count-1 \'loop sCNW="" If oWGui.GetClassLongA(aHData(n),GCW_ATOM)=49178 Then \'get atom listbox lGetI=oWGui.SendMessageA(aHData(n),LB_GETCURSEL,0,0) If lGetI<>LB_ERR Then \'get the selected item if any sCN=String(127,Chr(0)) sCNW=String(oWGui.SendMessageA(aHData(n),LB_GETTEXT,lGetI,MSG.GetBSTRPtr(sCN)),Chr(0)) oWaw.MultiByteToWideChar CP_ACP,0,MSG.GetBSTRPtr(sCN),-1,MSG.GetBSTRPtr(sCNW),LenB(sCNW) End If Else If oWGui.GetClassLongA(aHData(n),GCW_ATOM)=49175 Then \'get atom button lStyle=oWGui.GetWindowLongA(aHData(n),GWL_STYLE) If ((lStyle And BS_AUTOCHECKBOX)=BS_AUTOCHECKBOX) Or ((lStyle And BS_AUTORADIOBUTTON)=BS_AUTORADIOBUTTON) Then sCNW=False If oWGui.SendMessageA(aHData(n),BM_GETCHECK,0,0)=BST_CHECKED Then sCNW=True Else \'other pushbouton sCNW=GetBSTRCtrl(aHData(n)) End If Else \'get data for edit, combo, static... sCNW=GetBSTRCtrl(aHData(n)) End If End If dFrmData.Item(aKData(n))=sCNW \'la maj Next oWGui.DestroyWindow hWF Exit Do End If If sCNW="&ANNULER" Then dFrmData.RemoveAll oWGui.DestroyWindow hWF Exit Do End If End If End Select Case WM_COMMAND,WM_SYSCOMMAND If (MSG.GetItem("wParam")=2) Or (MSG.GetItem("wParam")=61536) Then \'close button or system menu dFrmData.RemoveAll oWGui.DestroyWindow hWF Exit Do End If End Select Else oWGui.TranslateMessage MSG.Ptr oWGui.DispatchMessageA MSG.Ptr End If Loop End Sub Public Sub AddControl(sName,sClass,sData,lLeft,lTop,lWidth,lHeight) \'add a control on the form create by CreateForm method \'sName: unique control name \'sClass: one of global system class name \'sData: control data \'lLeft,lTop: control position on screen \'lWidth, lHeight: control dimensions \'no return value Const WS_EX_CLIENTEDGE=&H200 Const DEFAULT_GUI_FONT=17 Const WM_SETFONT=&H30 Const WS_CHILD=&H40000000 Const WS_VISIBLE=&H10000000 Const WS_TABSTOP=&H10000 Const GWL_ID=-12 Const WS_VSCROLL=&H200000 Const BS_AUTOCHECKBOX=&H3 Const BS_AUTORADIOBUTTON=&H9 Const BS_GROUPBOX=&H7 Const BM_SETCHECK=&HF1 Const BST_CHECKED=1 Const LBS_HASSTRINGS=&H40 Const CBS_DROPDOWN=&H2 Const CB_ADDSTRING=&H143 Const LB_ADDSTRING=&H180 Const LBS_DISABLENOSCROLL=&H1000 Dim hWn \'current control handle Dim sD \'current control data Dim cbBuf \'array list/combo data Dim sX \'types buttons Dim lStyle \'current control styles Dim lStyleEx \'extended styles Dim lSL \'style liste or combo Dim fC \'flag check Dim fL \'flag list Dim n \'loop fC=False fL=False \'parameters definition for CreateWindowEx according to class control Select Case UCase(sClass) Case "EDIT" sX=sClass sD=sData lStyle=WS_CHILD+WS_VISIBLE+WS_TABSTOP lStyleEx=WS_EX_CLIENTEDGE Case "STATIC" sX=sClass sD=sData lStyle=WS_CHILD+WS_VISIBLE lStyleEx=0 Case "COMBOBOX" sX=sClass sD="" lStyle=WS_CHILD+WS_VISIBLE+CBS_DROPDOWN+WS_TABSTOP lStyleEx=0 cbBuf=Split(sData,"|") fL=True lSL=CB_ADDSTRING Case "LISTBOX" sX=sClass sD="" lStyle=WS_CHILD+WS_VISIBLE+WS_TABSTOP+WS_VSCROLL+LBS_HASSTRINGS+LBS_DISABLENOSCROLL lStyleEx=WS_EX_CLIENTEDGE cbBuf=Split(sData,"|") fL=True lSL=LB_ADDSTRING Case "BUTTON" sX=sClass sD=sData lStyle=WS_CHILD+WS_VISIBLE+WS_TABSTOP lStyleEx=0 Case "GROUPBOX" sX="button" sD=sData lStyle=WS_CHILD+WS_VISIBLE+BS_GROUPBOX lStyleEx=0 Case "CHECKBOX" sX="button" sD=sData lStyle=WS_CHILD+WS_VISIBLE+WS_TABSTOP+BS_AUTOCHECKBOX lStyleEx=0 fC=True Case "RADIOBUTTON" sX="button" sD=sData lStyle=WS_CHILD+WS_VISIBLE+WS_TABSTOP+BS_AUTORADIOBUTTON lStyleEx=0 fC=True Case Else Err.raise 10000,"Method AddControl","The class " & sClass & " is not a global system class" Exit Sub End Select hWn=oWGui.CreateWindowExA(lStyleEx,sX&"",sD&"",lStyle,lLeft,lTop,lWidth,lHeight,hWF,0,hIns,0) \'control creation oWGui.SendMessageA hWn,WM_SETFONT,oWGui.GetStockObject(DEFAULT_GUI_FONT),-1 \'default font If fL Then \'feed the listbox/combobox For n=0 to UBound(cbBuf) oWsm.SendMessageA hWn,lSL,0,MSG.GetBSTRPtr(cbBuf(n)) Next End If If fC Then \'check control with end\'s name is letter k If UCase(Right(sName,1))="K" Then oWGui.SendMessageA hWn,BM_SETCHECK,BST_CHECKED,0 End If dFrmData.Add sName,hWn \'add control handle to dictionnary End Sub \'************************************************************************************************************* IMPLEMENTATION
|
-- 作者:王锋
-- 发布时间:2012/3/30 18:02:52
-- [求助]麻烦将这个模型改成固定轮询模式,提前几秒下单
Private oWGui \'object API GUI Private oWsm \'object SendMessage (syntax different) Private oWaw \'object ANSI -> UNICODE conversion
Private MSG \'structure MSG from API Private hIns \'instance handle Private hWsh \'main window WScript handle (hidden) Private hWF \'form handle
Private Sub Class_Initialize \'Constructor Const GWL_HINSTANCE=-6 Set oWGui=CreateObject("DynamicWrapper") Set oWsm=CreateObject("DynamicWrapper") Set oWaw=CreateObject("DynamicWrapper") With oWGui .Register "user32.dll","FindWindowA","f=s","i=ss","r=l" .Register "user32.dll","CreateWindowExA","f=s","i=lsslllllllll","r=l" .Register "user32.dll","SetWindowPos","f=s","i=lllllll","r=l" .Register "user32.dll","GetMessageA","f=s","i=llll","r=l" .Register "user32.dll","DispatchMessageA","f=s","i=l","r=l" .Register "user32.dll","TranslateMessage","i=l","f=s","r=l" .Register "user32.dll","GetWindowLongA","f=s","i=ll","r=l" .Register "user32.dll","SendMessageA","f=s","i=llll","r=l" .Register "user32.dll","SetWindowLongA","f=s","i=lll","r=l" .Register "user32.dll","GetWindowLongA","f=s","i=ll","r=l" .Register "user32.dll","IsDialogMessageA","f=s","i=ll","r=l" .Register "user32.dll","DestroyWindow","f=s","i=l","r=l" .Register "user32.dll","GetFocus","f=s","r=l" .Register "user32.dll","GetWindowTextA","f=s","i=lll","r=l" .Register "user32.dll","GetWindowTextLengthA","f=s","i=l","r=l" .Register "user32.dll","GetClassLongA","f=s","i=ll","r=l" .Register "gdi32.dll","GetStockObject","f=s","i=l","r=l" End With oWsm.Register "user32.dll","SendMessageA","f=s","i=llls","r=l" \'di oWaw.Register "kernel32.dll","MultiByteToWideChar","f=s","i=llllll","r=l" Set MSG=New Struct With MSG .Add "hwnd","HWND",0 .Add "message","UINT",0 .Add "wParam","WPARAM",0 .Add "lParam","LPARAM",0 .Add "time","DWORD",0 .Add "ptx","POINTX",0 .Add "pty","POINTY",0 End With Set dFrmData=CreateObject("Scripting.Dictionary") hWsh=oWGui.FindWindowA("WSH-Timer",chr(0)) hIns=oWGui.GetWindowLongA(hWsh,GWL_HINSTANCE) End Sub Private Function GetBSTRCtrl(hdW) \' Return handle hdW control content as string BSTR Const CP_ACP=0 Dim sBuf,sBufW sBuf=String(oWGui.GetWindowTextLengthA(hdW),Chr(0)) sBufW=String(oWGui.GetWindowTextA(hdW,MSG.GetBSTRPtr(sBuf),oWGui.GetWindowTextLengthA(hdW)+1),Chr(0)) oWaw.MultiByteToWideChar CP_ACP,0,MSG.GetBSTRPtr(sBuf),-1,MSG.GetBSTRPtr(sBufW),LenB(sBufW) GetBSTRCtrl=sBufW End Function End Class
\'************************************************************************* DialogBox SAMPLE
Dim oFrm Set oFrm=New XGui oFrm.CreateForm "DialogBox by omen999",150,300,480,300,-1 \' modeless form oFrm.AddControl "label1","static","&Last Name :",10,8,60,16 oFrm.AddControl "edit1","edit","",10,26,120,20 oFrm.AddControl "label2","static","&First Name :",10,50,60,16 oFrm.AddControl "edit2","edit","",10,68,120,20 oFrm.AddControl "label3","static","A&ddress :",10,94,100,16 oFrm.AddControl "edit3","edit","",10,112,150,20 oFrm.AddControl "label4","static","&City :",10,136,100,20 oFrm.AddControl "edit4","edit","",10,152,100,20 oFrm.AddControl "gbox1","groupbox"," Sex ",6,178,84,72 oFrm.AddControl "rdbox1","radiobutton","&Male",10,194,68,18 oFrm.AddControl "rdbox2k","radiobutton","&Female",10,212,68,18 \'this control will be checked oFrm.AddControl "rdbox3","radiobutton","&Don\'t know",10,230,74,18 oFrm.AddControl "label5","static","&Status :",146,8,40,16 oFrm.AddControl "cbox1","combobox","single|married|divorcee",146,26,150,80 oFrm.AddControl "label6","static","&Type :",310,8,40,16 oFrm.AddControl "lbox1","listbox","anorexic|very thin|thin|normal|fat|obese|dead",310,28,150,80 oFrm.AddControl "ckbox1k","checkbox","Mem&ber",310,90,68,20 \'this control will be checked oFrm.AddControl "button1","button","&OK",392,240,70,24 oFrm.AddControl "button2","button","&Cancel",312,240,70,24 oFrm.ShowForm False oFrm.RunForm \'messages pump
\'display the dialogbox final content MsgBox oFrm.dFrmData.Item("label1") & vbLf &_ oFrm.dFrmData.Item("edit1") & vbLf &_ oFrm.dFrmData.Item("label2") & vbLf &_ oFrm.dFrmData.Item("edit2") & vbLf &_ oFrm.dFrmData.Item("label3") & vbLf &_ oFrm.dFrmData.Item("edit3") & vbLf &_ oFrm.dFrmData.Item("label4") & vbLf &_ oFrm.dFrmData.Item("edit4") & vbLf &_ oFrm.dFrmData.Item("gbox1") & vbLf &_ oFrm.dFrmData.Item("rdbox1") & vbLf &_ oFrm.dFrmData.Item("rdbox2k") & vbLf &_ oFrm.dFrmData.Item("rdbox3") & vbLf &_ oFrm.dFrmData.Item("label5") & vbLf &_ oFrm.dFrmData.Item("cbox1") & vbLf &_ oFrm.dFrmData.Item("label6") & vbLf &_ oFrm.dFrmData.Item("lbox1") & vbLf &_ oFrm.dFrmData.Item("ckbox1k") & vbLf &_ oFrm.dFrmData.Item("button1") & vbLf &_ oFrm.dFrmData.Item("button2")
|
-- 作者:testware
-- 发布时间:2012/4/6 17:20:09
--
好的,多谢多谢!! 本来是打算调用API来解决VBA下面没有StringBuilder的问题 后面发现拼字符串不是性能瓶颈
Anyway, thanks a lot!
|