Sign in to follow this  
Followers 0
serdem

Access same DllStruct from different scripts

6 posts in this topic

#1 ·  Posted (edited)

Hi everyone,

Is it possible to get/set content of a dllStruct that created by another script?

Edited by serdem

Share this post


Link to post
Share on other sites



Hi everyone,

Is it possible to get/set content of a dllStruct that created by another script?

Yes. You need to use a memory udf. Memory.au3 or NomadMemory.au3 say.

Or you could use messages so that one script creates the struct and the other can request a coy of the current data or request that the data is changed.

Even if you use the Memory approach you will need a mesage or some way to tell the second script what the memory address is for the struct.


Serial port communications UDF Includes functions for binary transmission and reception.printing UDF Useful for graphs, forms, labels, reports etc.Add User Call Tips to SciTE for functions in UDFs not included with AutoIt and for your own scripts.Functions with parameters in OnEvent mode and for Hot Keys One function replaces GuiSetOnEvent, GuiCtrlSetOnEvent and HotKeySet.UDF IsConnected2 for notification of status of connected state of many urls or IPs, without slowing the script.

Share this post


Link to post
Share on other sites

#3 ·  Posted (edited)

Hi!

This is very easy to do with the memory functions in WinAPI.au3 (included in autoit install package).

I've made a little demo that shows how you do it :P

Save this script and run it:

CODE

#include <ButtonConstants.au3>

$secretvalue = Random(0, 1000000, 1)

$struct = DllStructCreate("int;")

DllStructSetData($struct, 1, $secretvalue)

$hwnd = GUICreate("Secret", 170, 80)

$button = GUICtrlCreateButton("Secret value at " & DllStructGetPtr($struct) & @CRLF & "My PID is: " & @AutoItPID, 10, 10, 150, 60, $BS_MULTILINE)

GUISetState()

Do

$msg = GUIGetMsg()

If $msg = $button Then

$guess = InputBox("What is my value?", "Input your answer here:")

If $guess <> $secretvalue Then

MsgBox(16, "Wrong", "Wrong answer, try again :idea:")

Else

MsgBox(64, "Success", "Good job, I'm choosing a new value and a new ptr")

$secretvalue = Random(0, 1000000, 1)

$struct = DllStructCreate("int;")

DllStructSetData($struct, 1, $secretvalue)

GUICtrlSetData($button,"Secret value at " & DllStructGetPtr($struct) & @CRLF & "My PID is: " & @AutoItPID)

EndIf

EndIf

Until $msg = -3

Then you can use this script to find out what value the first script is holding:

CODE

#include <WINAPI.au3>

Local $read

Local $pid

Local $pointer

$pid=InputBox("PID of process to read","PID here")

If $pid="" Then Exit

$pointer=InputBox("Pointer to the memory","Pointer here")

If $pointer="" Then Exit

$struct=DllStructCreate("int;")

; Open process with PROCESS_VM_READ access

$hprocess=_WinAPI_OpenProcess(0x0010,false,$pid,false)

_WinAPI_ReadProcessMemory($hprocess,$pointer,DllStructGetPtr($struct),4,$read)

MsgBox(0,"The Secret value is: ",DllStructGetData($struct,1))

:(

Edited by monoceres

Broken link? PM me and I'll send you the file!

Share this post


Link to post
Share on other sites

Yes. You need to use a memory udf. Memory.au3 or NomadMemory.au3 say.

Or you could use messages so that one script creates the struct and the other can request a coy of the current data or request that the data is changed.

Even if you use the Memory approach you will need a mesage or some way to tell the second script what the memory address is for the struct.

Thanks Martin,

What I want to do is to create a dllstruct and set some data into that struct from first script and make second script informed using dllCall 'sendmessage'.

With this message I also send the pointer of dllstruct (DLLStructGetPtr).

But I never succeed it up to now.

Share this post


Link to post
Share on other sites

Thanks Martin,

What I want to do is to create a dllstruct and set some data into that struct from first script and make second script informed using dllCall 'sendmessage'.

With this message I also send the pointer of dllstruct (DLLStructGetPtr).

But I never succeed it up to now.

This example might help.

Also have a look at ChrisL's udf in example scripts which makes using messages simpler.


Serial port communications UDF Includes functions for binary transmission and reception.printing UDF Useful for graphs, forms, labels, reports etc.Add User Call Tips to SciTE for functions in UDFs not included with AutoIt and for your own scripts.Functions with parameters in OnEvent mode and for Hot Keys One function replaces GuiSetOnEvent, GuiCtrlSetOnEvent and HotKeySet.UDF IsConnected2 for notification of status of connected state of many urls or IPs, without slowing the script.

Share this post


Link to post
Share on other sites

Hi!

This is very easy to do with the memory functions in WinAPI.au3 (included in autoit install package).

I've made a little demo that shows how you do it :P

:(

Thank you monoceres,

This is exactly what I want. Your demo scripts are great!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0