PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » PureBasic для Windows » Процедуры


Процедуры

Сообщений 31 страница 39 из 39

31

Нельзя просто так добратся до памяти другой проги.
МелкоМягкие считают что это повышает безопасность и стабильность работы приложений.
Именно по этой причине, прежде чем использовать память, её нужно выделить с помощью AllocateMamory.

Вообще-то из памяти "чужой" проги, можно получить данные, например, как сденно здесь http://purebasic.info/phpBB2/viewtopic.php?t=686

0

32

но ведь в с DLL (выделение мышью, которую мы недавно доводили до ума), мы залезли в память без танцев с бубном.

0

33

DLL пренадлежала тому-же процесу что и EXE.
А тут два разных процесса!

0

34

Пётр написал(а):

Вообще-то из памяти "чужой" проги, можно получить данные, например, как сденно здесь http://purebasic.info/phpBB2/viewtopic.php?t=686

За это Петр спасибо тебе и Виталию(kvitaly). Рано или поздно я бы подошел близко к этому вопросу. Всегда интересовало как работают программы типа Artmoney

0

35

Как через DLL передавать связанный список  ?
Не могу врубится.

Код:
Structure my_list
  n.l   ;номер
  name.s  ;имя
  url.s   ;адрес
EndStructure

Global NewList my_list.my_list()



ProcedureDLL Function1()

    AddElement(my_list())
           
      my_list()\n    =1
      my_list()\name ="Аниме"
      my_list()\url  ="http://fs.ua/video/films/?gfl=film_genre&search=%D0%90%D0%BD%D0%B8%D0%BC%D0%B5" 

    AddElement(my_list())
 
      my_list()\n    =2
      my_list()\name ="Биография"
      my_list()\url  ="http://fs.ua/video/films/?gfl=film_genre&search=%D0%91%D0%B8%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D1%8F"

    AddElement(my_list())
 
      my_list()\n    =3
      my_list()\name ="Боевик"
      my_list()\url  ="http://fs.ua/video/films/?gfl=film_genre&search=%D0%91%D0%BE%D0%B5%D0%B2%D0%B8%D0%BA"
 
 
EndProcedure

0

36

Попробуй так:

Код:
Structure my_list
  n.l   ;номер
  name.s  ;имя
  url.s   ;адрес
EndStructure

;Global NewList my_list.my_list()



ProcedureDLL Function1(List my_list.my_list())

    AddElement(my_list())
           
      my_list()\n    =1
      my_list()\name ="Аниме"
      my_list()\url  ="http://fs.ua/video/films/?gfl=film_genre&search=%D0%90%D0%BD%D0%B8%D0%BC%D0%B5" 

    AddElement(my_list())
 
      my_list()\n    =2
      my_list()\name ="Биография"
      my_list()\url  ="http://fs.ua/video/films/?gfl=film_genre&search=%D0%91%D0%B8%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D1%8F"

    AddElement(my_list())
 
      my_list()\n    =3
      my_list()\name ="Боевик"
      my_list()\url  ="http://fs.ua/video/films/?gfl=film_genre&search=%D0%91%D0%BE%D0%B5%D0%B2%D0%B8%D0%BA"
 
 
EndProcedure

Не знаю будет ли работать при передаче в DLL, но просто в коде, все нормально работает.

0

37

Так должно быть ? не работает...

Код:
Structure my_list
  n.l   ;номер
  name.s  ;имя
  url.s   ;адрес
EndStructure

Global NewList my_list.my_list()



ProcedureDLL Function1(List my_list.my_list())



    AddElement(my_list())
           
      my_list()\n    =1
      my_list()\name ="Аниме"
      my_list()\url  ="http://fs.ua/video/films/?gfl=film_genre&search=%D0%90%D0%BD%D0%B8%D0%BC%D0%B5" 

    AddElement(my_list())
 
      my_list()\n    =2
      my_list()\name ="Биография"
      my_list()\url  ="http://fs.ua/video/films/?gfl=film_genre&search=%D0%91%D0%B8%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D1%8F"

    AddElement(my_list())
 
      my_list()\n    =3
      my_list()\name ="Боевик"
      my_list()\url  ="http://fs.ua/video/films/?gfl=film_genre&search=%D0%91%D0%BE%D0%B5%D0%B2%D0%B8%D0%BA"
 
 
EndProcedure


;***************************Вызов******************************



Structure my_list
  n.l   ;номер
  name.s  ;имя
  url.s   ;адрес
EndStructure

Global NewList my_list.my_list()




If OpenLibrary(1,"DLL.dll")
  

Prototype Function1(List my_list.my_list())
Function1.Function1 = GetFunction(1, "Function1")

Function1(my_list.my_list())

          ForEach my_list() ; В цикле сканирется динамически связанный список
           If my_list()\n= 1
           
             Debug  my_list()\name
             Debug  my_list()\url

           EndIf
         Next

 CloseLibrary(1) ; Закрытие динамической библиотеки подпрограмм.
EndIf

Отредактировано mirashic (13.01.2012 15:06:24)

0

38

Спасибо разобрался, заработало...

0

39

Пётр написал(а):

из памяти "чужой" проги, можно получить данные, например, как сденно здесь http://purebasic.info/phpBB2/viewtopic.php?t=686

ссылка померла :( где еще можно поглядеть примеры?

вроде нашел... хотя пока не ясно откуда взять размер в памяти процесса, чтобы сделать дамп для начала.
https://www.purebasic.fr/english/viewtopic.php?t=77846

итак, понадергал отовсюду откуда мог... и чот не понимаю пока-что :) сделал болванку окна. занимает 904 килобайта.

код:

Код:
EnableExplicit

Prototype.l GetProcessMemoryInfo(hProcess.l, *p, cb.l)

Define psApiDLL.i
Define hproc.i
Define memoryInUseMB.f

Define GetProcessMemoryInfo.GetProcessMemoryInfo
Define p.PROCESS_MEMORY_COUNTERS

psApiDLL = OpenLibrary(#PB_Any, "PSAPI.DLL")
If psApiDLL > 0
  GetProcessMemoryInfo = GetFunction(psApiDLL, "GetProcessMemoryInfo") 
  Debug "GetProcessMemoryInfo = " + Str(GetProcessMemoryInfo)
Else
  MessageRequester("error", "Unable To open PSAPI.DLL")
  End
EndIf
  

Procedure.i memBase(ProcessId.i,Name.s)
  Protected handle.i
  Protected me32.MODULEENTRY32
  Protected base.i
  handle = CreateToolhelp32Snapshot_(#TH32CS_SNAPMODULE32|#TH32CS_SNAPMODULE,ProcessId)
  If Not handle = #INVALID_HANDLE_VALUE
    me32\dwSize = SizeOf(MODULEENTRY32)
    If Module32First_(handle,@me32)
      Name = LCase(Name)
      Repeat
        If LCase(PeekS(@me32\szModule)) = Name
          base = me32\modBaseAddr
          Break
        EndIf
      Until Module32Next_(handle,@me32) = #False
    EndIf
    CloseHandle_(handle)
  EndIf
  ProcedureReturn base
EndProcedure

Procedure.i Main()
  Protected hwnd.i
  Protected pid.i
  Protected hproc.i
  Protected base.i
  Protected address.i
  ; поиск хендла по названию окна
  hwnd = FindWindow_(#Null, "Gens r57shell mod - Idle")
  If hwnd
    ; получаем пид из хендла
    GetWindowThreadProcessId_(hwnd, @pid)
    Debug "hwnd:  0x" + Hex(hwnd)
    Debug "pid:   " + pid
    ; открываем процесс по полученному пид для чтения (и видимо записи?)
    hproc = OpenProcess_(#PROCESS_ALL_ACCESS, #False, pid)
    
    If hproc
      ; если открылся процесс
      Debug "hproc: 0x" + Hex(hproc)
      
      ; видимо получение адреса, начиная с которого этот ехе болтается в памяти
      base = memBase(pid, "Gens_R57Shell_mod.exe");<-not sure what the exe name is!
      Debug "base:  0x" + Hex(base)
      Debug ""
      
      ;{ пока пропускаем
      Goto marker:
      ; прочитать из какого-то адреса (base + $A55D64) нужный размер данных (4) в переменную (address)
      ReadProcessMemory_(hproc, base + $A55D64, @address, 4, #Null);<- a pointer is 4 bytes according to CE
      
      If address
        Debug "addr1: 0x" + Hex(address)
        ; если данные были получены
        
        ; дальше уже прыгать от полученного адреса дальше и читать
        ReadProcessMemory_(hproc, address + $110, @address, 4, #Null)
        If address
          Debug "addr2: 0x" + Hex(address)
          ReadProcessMemory_(hproc, address, @address, 4, #Null)
          If address
            Debug "health: " + Str(address)
          EndIf
        EndIf
      EndIf
      marker:
      ;}
       
      ;CloseHandle_(hproc)
    EndIf
    
  EndIf
  
  ProcedureReturn hproc
  
EndProcedure

hproc = Main()
If hproc
  
  ; не хочет скатина внутри процедуры
  If GetProcessMemoryInfo(hproc, @p, SizeOf(PROCESS_MEMORY_COUNTERS))
  
  ;DWORD  cb;
  ;DWORD  PageFaultCount;
  ;SIZE_T PeakWorkingSetSize;
  ;SIZE_T WorkingSetSize;
  ;SIZE_T QuotaPeakPagedPoolUsage;
  ;SIZE_T QuotaPagedPoolUsage;
  ;SIZE_T QuotaPeakNonPagedPoolUsage;
  ;SIZE_T QuotaNonPagedPoolUsage;
  ;SIZE_T PagefileUsage;
  ;SIZE_T PeakPagefileUsage;
  
  Debug "cb = " + Str(p\cb)
  Debug "PageFaultCount = " + Str(p\PageFaultCount)
  Debug "PeakWorkingSetSize = " + Str(p\PeakWorkingSetSize)
  Debug "WorkingSetSize = " + Str(p\WorkingSetSize)
  Debug "QuotaPeakPagedPoolUsage = " + Str(p\QuotaPeakPagedPoolUsage)
  Debug "QuotaPagedPoolUsage = " + Str(p\QuotaPagedPoolUsage)
  Debug "QuotaPeakNonPagedPoolUsage = " + Str(p\QuotaPeakNonPagedPoolUsage)
  Debug "QuotaNonPagedPoolUsage = " + Str(p\QuotaNonPagedPoolUsage)
  Debug "PagefileUsage = " + Str(p\PagefileUsage)
  Debug "PeakPagefileUsage = " + Str(p\PeakPagefileUsage)
  
  
  memoryInUseMB = (p\WorkingSetSize + p\PagefileUsage) / 1048576 ; (откуда это число 1048576...)
  Debug memoryInUseMB  
  Debug "memory use = " + StrF(memoryInUseMB, 2)
  
  EndIf
  
  CloseHandle_(hproc)
  
EndIf

End


;cb = 40
;PageFaultCount = 1354
;PeakWorkingSetSize = 5242880
;WorkingSetSize = 5242880
;QuotaPeakPagedPoolUsage = 125288
;QuotaPagedPoolUsage = 124648
;QuotaPeakNonPagedPoolUsage = 8160
;QuotaNonPagedPoolUsage = 7680
;PagefileUsage = 1130496
;PeakPagefileUsage = 1146880
;6.078125
;memory use = 6.08

; и где тут размер в 904килобайт?!?!?!

вот получаю эти значения:

;cb = 40
;PageFaultCount = 1354
;PeakWorkingSetSize = 5242880
;WorkingSetSize = 5242880
;QuotaPeakPagedPoolUsage = 125288
;QuotaPagedPoolUsage = 124648
;QuotaPeakNonPagedPoolUsage = 8160
;QuotaNonPagedPoolUsage = 7680
;PagefileUsage = 1130496
;PeakPagefileUsage = 1146880
;6.078125
;memory use = 6.08

как понять что по итогу 904 килобайта, как виндосовский диспетчер задач показывает? (тот что ctrl + shift + esc)

там вроде есть формула какая-то:
memoryInUseMB = (p\WorkingSetSize + p\PagefileUsage) / 1048576

но она фигню какую-то показывает... и что за делитель 1048576 ?

ага. затупил 1048576 = это 1024 * 1024. но один фиг пока не понятно как 904 килобайта получить.

Отредактировано SeregaZ (29.02.2024 10:41:48)

0


Вы здесь » PureBasic - форум » PureBasic для Windows » Процедуры