PureBasic - форум

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

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


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Вопросы новичка (продолжение…)


Вопросы новичка (продолжение…)

Сообщений 961 страница 974 из 974

961

Значит FireFox стоит "браузером по умолчанию".

Исходя из описания функции
> Result = RunProgram(Filename$ [, Parameter$, WorkingDirectory$ [, Flags [, SenderProgram]]])

попробуй так

Prog=RunProgram("chrome.exe","https://mail.ru/","",#PB_Program_Open)

0

962

Здравствуйте. Помогите разобраться кто может. Есть код. Даже работает, но криво.  смысл в наполнении ComboBox из файла с сортировкой согласно введенных символов. проблема в том, что в самом Combo не отображаются символы и вообще возникает ощущение зависания. Где ошибка? Спасибо заранее

Procedure Sv_Spis(N_Okna.l,File.s,Mark.s)
  ClearGadgetItems (N_Okna)
A=Len(Mark)
  If ReadFile(2,File)
    While Eof(2) = #False
      S1.s=ReadString(2)
      If Mid(S1,1,A)=Mark
        b=1
      EndIf
    Wend
    CloseFile(2)
   EndIf
    If b=1
      SendMessage_(GadgetID(N_Okna),#CB_SHOWDROPDOWN,1,1)   
    EndIf
  EndProcedure

If OpenWindow(0, 0, 00, 1200, 800, "", #PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget| #PB_Window_ScreenCentered)
   
ComboBoxGadget(1, 400, 10, 300, 25,#PB_ComboBox_Editable )     

  Repeat
         Event.l = WaitWindowEvent()
         Select Event
     
           Case #PB_Event_Gadget
 
             Select EventGadget()
                 
               Case 1
              If GetGadgetText(1)<>Str_G.s 
                     
                Str_G.s=GetGadgetText(1)   
                Sv_Spis(1,"FileNaim",Str_G)
              EndIf
                           
                  EndSelect
      EndSelect 
    Until Event=#PB_Event_CloseWindow
  EndIf
  End

0

963

В коде не заполняется ComboBox.

0

964

спасибо. действительно в данном фрагменте отсутсвует add.
Но в целом все равно не могу наполнить Combo с подсказкой. Это вообще реально?
Чтоб при наборе текста шел выбор значений наполнения и выпадал список?
Варианты пробовал разные. либо в комбике курсор встает в поз 1 либо текст ввода не отображается либо присваивается верхнее значение из списка

0

965

Здравствуйте!
Создал TCP сервер, который получает некие данные, разделённые $0D $0A. Каждый параметр я распихиваю по разным гаджетам в окошке
Принимаю

Код:
 ReceiveNetworkData(Cl, *Buffer, 1000)
  
text_tcp=PeekS(*Buffer,-1,#PB_Ascii )

FillMemory(*Buffer, 1000)

Подскажите , как мне считывать из буфера до  $0D $0A?
или может как то их вытягивать уже из переменной text_tcp,?

0

966

Код:
text_tcp.s="1234"+Chr($0D)+Chr($0A)+"5678"+Chr($0D)+Chr($0A)

Count = CountString(text_tcp, Chr($0D)+Chr($0A))

For i=1 To Count
  Debug StringField(text_tcp, i, Chr($0D)+Chr($0A))
Next

0

967

тут Петр писал код по созданию окна со своим собственным классом: Вопросы новичка (продолжение…)

однако у меня ругается:
Unresolved external symbol
'_PB_Window_ProcessEvent_UNICODE@16'

нет ли такого-же кода, но с перламутровыми пуго... эээ... для PB 6.0 ?

а второй вопрос больше пространные рассуждения в попытках нащупать свет в конце туннеля... понятно что свет это не то, что можно потрогать...
есть две программы. в одной включается режим ожидания. после ручками идем в другую папку, запускаем вторую программу, там делаем какие-то операции, и вторая после этих операций соединяется с первой, или первая сама видит что все готово - соединяется со второй и они начинают вдвоем работать. можно ли сие дело как-то перехватить и понять как это работает? подумал может шлются сообщения в окно... и хочу сделать болванку программы под закос второй программы в этой семейной паре. титул в окне у меня ума хватило сделать такой-же. вторым шагом думаю нужно указать класс окна. о... название ехе файла еще не пробывал :) пойду переименую свою болванку и перепроверю... и да. вроде как есть полу исходники этого процесса, но я там ничерта не понимаю и это не PB.

***

с первой задачей справился. но нет, первая программа не среагировала :)

Отредактировано SeregaZ (16.02.2024 06:19:34)

0

968

итак... по всей видимости в обеих программах поднимаются сервера для приемки сообщений. делаю сервер на PB на нужном порту. после запускаю первую программу. она пытается на PB сервер что-то отправить. запоминаю этот пакет. делаю операцию наоборот - запускаю вторую программу, и пытаюсь из PB отправить этот пакет в неё... но чот не выходит. решил посмотреть через tcpview. и там выясняется что первая программа, помимо поднятия сервера для приемки - время от времени отправляет какой-то запрос по совершенно другому адресу. казалось бы - запоминай порт и пиши приемщик на этом порту... но в том то и проблема :) там каждый раз новый порт, скажем + 2 к последнему порту. но каким-то образом вторая программа об этом знает. так что я пока в тупике. и в связи с чем вопрос! нет ли для PB некоего широкопортового сервера, чтобы он ваще все порты слушал? в справке PB полистал и вроде там есть что-то такое GetClientPort(Client) , но что-то я пока не понимаю как это работает. ведь сначала же надо сервер многопортовый запустить... голова кароче не соображает :) а в исходниках ничерта не понимаю... надеялся там что-то типа описание протокола есть.

***

ага! GetClientPort(Client) помогло! теперь, я так понимаю, мне нужно второй чтоль сервер запускать с этим портом, чтобы прочитать чего он хочет? или я чото не понимаю :)

Отредактировано SeregaZ (16.02.2024 15:58:21)

0

969

SeregaZ написал(а):

отправляет какой-то запрос по совершенно другому адресу.

По какому? Локальный, глобальный?

SeregaZ написал(а):

надеялся там что-то типа описание протокола есть.

Если нет описания протокола, то как планируете взаимодействовать с программой?

SeregaZ написал(а):

мне нужно второй чтоль сервер запускать с этим портом, чтобы прочитать чего он хочет? или я чото не понимаю

Маловероятно. Нет никакого смысла запускать 1500 серверов если достаточно одного.

0

970

да, я ошибся и не туда посмотрел. первая программа стабильно один сервер на одном порту, и вторая стабильно на другом порту. а те, каждый раз новые соединения - с новыми портами - это исходящий порт так сказать, откуда производится попытка отослать что-то в тот постоянный порт сервера второй программы. но я так понял что все плохо. в этом единственном пакете что я поймал было:

Код:
PRI * HTTP/2.0 

SM

а это типа все очень и очень плохо :) кто-то пишет нужны сертификаты, кто-то что шифрование... черт ногу сломит. я надеялся там простенько.

по поводу протокола - исходники то есть, но там кажется си++, и очень много всяких файлов, где черт ногу сломит. так то по тексту окошка, которое вылазит в первой программе - где что-то типа "Wait connection" - я нашел где это, но там какого-то порядка команд или может их значений в каком-то Select - не вижу.

0

971

вот как происходит в оригинале, и как с моими попытками это эмулировать. меня смущает что PB стартует сервера с адреса 0.0.0.0 хотя должно быть по идее 127.0.0.0. и я не вижу ответа, хотя вроде бы там что-то есть какое-то движение...

https://i123.fastpic.org/big/2024/0217/6f/0dc5c2af18c2dbe41c2b1232008a416f.png

вот так пытаюсь отправить первоначальный пакет, и по идее должен получить ответ, так как TCPView что-то видит исходящее... но видимо я чото не то "слушаю" и поэтому ответ не доходит куда надо...

Код:

Enumeration
  
  #Server01
  
  #Window
  
  #Editor
  
  #Button
  
EndEnumeration

Port = 24946 ; IDA
;Port = 23946 ; GENS

Global EOL$
EOL$ = Chr(13)+Chr(10)

*Buffer = AllocateMemory(10000)

*SendBuffer = AllocateMemory(200)
Length = *SendBuffer
Length + PokeS(Length, "PRI * HTTP/2.0" + EOL$, -1, #PB_UTF8)  
Length + PokeS(Length, ""               + EOL$, -1, #PB_UTF8)  
Length + PokeS(Length, "SM"             + EOL$, -1, #PB_UTF8)  
Length + PokeS(Length, ""               + EOL$, -1, #PB_UTF8)   
;Length + PokeS(Length, ""               + EOL$, -1, #PB_UTF8) 
Length + PokeS(Length, #CRLF$, -1, #PB_UTF8) 

test$ = PeekS(*SendBuffer, Length - *SendBuffer, #PB_UTF8) ;: Debug test$

If CreateNetworkServer(#Server01, Port)

  OpenWindow(#Window, 100, 40, 400, 300, "IDA")
  
  StickyWindow(#Window, 1)
  
  EditorGadget(#Editor, 10, 10, 380, 240)
  
  ButtonGadget(#Button, 10, 260, 100, 20, "send header")
  
  ;Debug "server starts " + Str(Port)
  AddGadgetItem(#Editor, -1, "server starts " + Str(Port))

  Repeat
    
    ;{ windows repeat
    Repeat
      WEvent = WindowEvent()
      
      Select WEvent
          
        Case #PB_Event_Gadget
          Select EventGadget()
                        
            Case #Button
              ; i should send
              ;PRI * HTTP/2.0
              ;
              ;SM
              ;
              
              ConnectionID = OpenNetworkConnection("127.0.0.1", 23946) ; to Gens
              If ConnectionID
                AddGadgetItem(#Editor, -1, "have connection for send")                
                
                sendresult = SendNetworkData(ConnectionID, *SendBuffer, Length - *SendBuffer)
                
                AddGadgetItem(#Editor, -1, "result of sending " + Str(sendresult))

                ;CloseNetworkConnection(ConnectionID)
              Else
                ;MessageRequester("PureBasic - Client", "Can't find the server (Is it launched ?).", 0)
                AddGadgetItem(#Editor, -1, "probably server is not work")
              EndIf
              
              
          EndSelect
          
        Case #PB_Event_CloseWindow
          Quit = 1
         
          
      EndSelect

    Until WEvent = 0
    ;}
    
    SEvent = NetworkServerEvent()     
    If SEvent
      ; some event happen
      
      ServerID = EventServer()
      ; what server it was
      
      ClientID = EventClient()
      ; what client it was
  
      Select SEvent
      
        Case 1  ; When a new client has been connected...
          ;Debug "in"
          AddGadgetItem(#Editor, -1, Str(ServerID) + " connection")
          
          
        Case 4  ; When a client has closed the connection...
          ;Debug "*** out"
          AddGadgetItem(#Editor, -1, Str(ServerID) + " disconnection")
          
        Default
          RequestLength = ReceiveNetworkData(ClientID, *Buffer, 2000)
          If RequestLength
            a$ = PeekS(*Buffer, RequestLength, #PB_UTF8)
            AddGadgetItem(#Editor, -1, a$)
          Else
            AddGadgetItem(#Editor, -1, "zero")
          EndIf
          
      EndSelect

    Else
      Delay(20)  ; Don't stole the whole CPU !
    EndIf
    
  Until Quit = 1 
    
  CloseNetworkServer(#Server01)
Else
  MessageRequester(AtomicTitle$, "Error: can't create the server (port in use ?).", 0)
EndIf
  
End 
 

конечно при условии что этот PRI * HTTP/2.0 не говорит о том, что мне нужны какие-то дополнительные танцы с бубном с подключением библиотек и всего такого прочего. стандартные средства PB я еще чо-то как-то... а вот когда надо что-то отдельно подключать, то здесь все. капец.

***

нули победил.

Код:
If CreateNetworkServer(#Server01, Port, #PB_Network_TCP, "127.0.0.1")

толку не дало :)

Отредактировано SeregaZ (17.02.2024 04:24:40)

0

972

Код:
PRI * HTTP/2.0

HTTP версии 2.0 — это нетекстовый протокол. Спецификации можно читать тут: https://www.rfc-editor.org/rfc/rfc7540

Кроме того, у вас сервер принимает соединение после того как окно закроется.

0

973

ну я пока бросил эту затею... не понимаю :) почитал зато блог того автора, и там он пишет про какую-то shared memory. видимо сервер тут просто первоначальную связь между программами наладить... а дальше видимо происходит что-то типа как ArtMoney делает, то есть влезает в чужую программу и пишет в её память. и эта чужая программа делает точно также в обратную сторону. видимо это работает как-то так.

пока решил доделать то, что понимаю и что получается :)

0

974

итак. рассказываю. при загрузке файла происходит первоначальный парсинг. а после добавление к этому распарсенному нераспарсенных участков, где как в хекс редакторе происходит компоновка по 16 байт в ряд. это добавление не обработанного кода занимает 95% времени при загрузке. ладно я как бы еще смирился, что такой затуп будет происходить при загрузке файла... один раз как бы. но потом решил добавить еще "горячее" дизассемблирование по клавише С начиная с какого-то, мышкой щелкнутого, байта. для чего сделал так:

1. первоначальный парсинг. собирается только код и вносится в лист.
2. происходит копия этого листа в некую базовую начальную копию.
3. происходит добавление в лист "бэшек" - то есть нераспарсенного кода dc.b. (получается дописывает в конец листа все блоки бэшек)
4. сортировка листа по адресу в роме. тут все становится на свои места. блоки кода правильно чередуются с блоками бэшек. и мы имеем готовый лист построчно для вывода на канвасе.

тут приспичило пользователю жмакнуть С - горячий дизасм на какой-то бэшке.
1. происходит восстановление копии первоначального парсинга кода в основной лист, который без бэшек а только код, который распарсился в самом самом начале.
2. происходит добавление нового адреса из той клавиши С, или даже адресов, так как там может быть рекурсия, что родились при этом горячем дизасме.
3. происходит добавление в лист бэшек.
4. сортировка листа по адресу.

вот это самое добавление в лист бэшек и жрет 95% времени затупа... как бы найти элегантное, а главное быстрое решение? то есть изначально весь код разбивается на строки, которые потом можно скроллить в выводном канвасе. там происходит форматирование, где надо добавляются пустые строки для визуального отделения блоков, где надо добавляются метки. может быть делать два листа - лист с блоками кода, а второй с блоками бэшек. но потом как отслеживать в этом втором листе какие бэшки перешли в разряд кода и значит их надо удалить, какие оставить... мутно все в голове однако :) не могу ухватить мысль как выкрутится.

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Вопросы новичка (продолжение…)