PureBasic - форум

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

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


Вы здесь » PureBasic - форум » PureBasic для Windows » Как передать данные другой программе?


Как передать данные другой программе?

Сообщений 1 страница 11 из 11

1

В справке PB с командой RunProgram() я не подружился.
С обычным запуском другой программы с обычными  параметрами все понятно, тут вопросов нет.
Меня интересуют ключ #PB_Program_Write

По форумам искал. К уважаемому AZJO на http://azjio.narod.ru/ заходил. У чат GPT спрашивал(он мне убедительную чушь написал), по итогу, ничего не нашел.
Вот я пишу

Код:
command.s = ""
dir.s = GetCurrentDirectory()
Compiler = RunProgram("xlam8.exe",command, dir, #PB_Program_Open | #PB_Program_Write) 
Output$ = "ХАХА!"
If Compiler
  WriteProgramString(Compiler, Output$, #PB_UTF8)
EndIf

Как отловить это 'ХАХА' в другой программе на PB?
(вариант делать это через файл рабочий, но хочется более элегантно это делать)

0

2

Код:
command.s = ""
dir.s = GetCurrentDirectory()
Compiler = RunProgram("xlam8.exe",command, dir, #PB_Program_Open | #PB_Program_Write) 
Output$ = "ХАХА!"
If Compiler
  WriteProgramString(Compiler, Output$, #PB_Unicode)
EndIf

xlam8.exe

Код:
OpenConsole()
MessageRequester("", Input())

0

3

А точно нужно консольный метод? Точно нужен не ProgramParameter()?
Гуглить на официальном форуме ReadProgramString, примеров там десятки.
Посмотрел в справке там пример есть только в RunProgram. Надо это исправить (пока PureBasic обновляют).

Отредактировано AZJIO (17.08.2023 22:22:15)

0

4

Спасибо, работает.

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

If Compiler
  WriteProgramString(Compiler, Output$, #PB_Unicode)
EndIf

Но почему не работает с ключоми #PB_UTF8/#PB_Ascii ? Я с ними игрался. наверное, во всех комбинациях, а вот  на #PB_Unicode даже не посмотрел.

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

...ReadProgramString...

интерсная тема. Мне обязательно надо ее посмотреть внимательно. У PB известная боль, это отсутствие достаточного справочного материала. Прошаренный народ клубится местечково.  А вот так, да чтоб с нуля, нужно иметь очень большую мотивацию на фоне других языков, где инфы море.

Отредактировано Goga (18.08.2023 07:00:42)

0

5

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

Но почему не работает с ключоми #PB_UTF8/#PB_Ascii

Потому что программа ждет юникод, а не другие кодировки.

0

6

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

Потому что программа ждет юникод, а не другие кодировки.

Странно тогда. Зачем тогда вводить ключи #PB_UTF8/#PB_Ascii в открытие консоли и в   WriteProgramString() ? Наверное, чтобы людей сбивать с толку  o.O

0

7

Затем, что взаимодействовать приходится с программами написанными не нами и не на PureBasic.
Лично сталкивался со всеми вариантами.
Скажу больше, UTF16-UTF16 использовал как раз только с PB, в других случаях #PB_UTF8/#PB_Ascii
p.s. И я не пойму в чём проблема. ReadProgramString(Program [, Flags]) имеет такой же флаг.
Т.е. они просто должны быть одинаковыми у того кто пишет и у того кто читает.
p.p.s. и не забывать про наличие WriteProgramData-ReadConsoleData и WriteConsoleData-ReadProgramData для полной свободы.

Отредактировано useful (20.08.2023 07:25:14)

0

8

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

#PB_UTF8/#PB_Ascii

строки в PureBasic = #PB_Unicode, то что находится в переменных - #PB_Unicode. Чтобы писать и читать #PB_UTF8/#PB_Ascii используйте WriteProgramData и ReadProgramData и

Код:
*Buffer = UTF8(String$)
*Buffer = Ascii(String$)

вы должны всегда знать в каком формате находятся у вас данные для передачи и под это подстраивать функции. Если у вас строка String$ в Unicode зачем вам плодить сущности через UTF8() вы только тратите гигафлопсы, подстраивайте, т.е. используйте те функции чтобы не перекодировать данные. Если данные предоставлены железно в UTF8, например прочитав из файла в указатель, то и отправляйте этот указатель как есть WriteProgramData(), в противном случае у вас больше возможностей, что WriteProgramData , что WriteProgramString.

Отредактировано AZJIO (20.08.2023 21:54:35)

0

9

WriteProcessMemory(),ReadProcessMemory()
В MSDN есть что-то такое.

Отредактировано PSY (10.12.2023 15:51:44)

0

10

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

WriteProcessMemory(),ReadProcessMemory()
В MSDN есть что-то такое.

Мы не ищем лёгких путей, только жесткач, только хардкор! :tired:

Отредактировано Smitis (10.12.2023 20:34:50)

0

11

Искать на форуме примеры с "wm_copydata". Странно, форум переводит константу в нижний регистр.

Ссылка для поиска: #WM_COPYDATA site:purebasic.fr/

Вот из моей программы My_Notepad_Sci. Суть если программа уже запущена, то повторный запуск программы передаёт путь уже открытой программе.

Код:
Procedure RunOnce_Startup()
	Protected Result, files$, TargetWnd, Mutex$, Count, i, copydata.COPYDATASTRUCT ; , RunOnceMutex
	Result = #False ; не выходить из редактора
	; 	мы можем создать мьютекс с путём к программе, это быстрее
	Mutex$ = ReplaceString(ProgramFilename(), "\", "|")

; 	RunOnceMutex = CreateMutex_(0, 0, Mutex$)
	CreateMutex_(0, 0, Mutex$)

; 	если мьютекс существует, то... то отправляем данные существующей программе
	If GetLastError_() = #ERROR_ALREADY_EXISTS
    Result = #True ; закрыть редактор после этого
    Count = CountProgramParameters()
    If Count
    	; временное окно до открытия окон, которое тут же будет закрыто, поэтому его id не важен
    	If OpenWindow(0, 0, 0, 0, 0, "", #PB_Window_Invisible)

        For i = 0 To Count - 1
        	files$ + ProgramParameter(i) + Chr(10)
        Next
        files$ = RTrim(files$, Chr(10))

        copydata\dwData = #pble
        copydata\cbData = (Len(files$) + 1) * #CharSize	 ; include null
        copydata\lpData = @files$
        TargetWnd = WinGetHandle()
        SendMessage_(TargetWnd, #WM_COPYDATA, WindowID(0), @copydata)
        CloseWindow(0)
        SetForegroundWindow(TargetWnd)

    	EndIf
    EndIf
	EndIf

	ProcedureReturn Result
EndProcedure

Procedure MyWindowCallback(WindowID, Message, WParam, lParam)
	Protected Result, *copydata.COPYDATASTRUCT
	Result = #PB_ProcessPureBasicEvents
	; событие WM_COPYDATA - произошла передача данных
	If Message = #WM_COPYDATA
    *copydata.COPYDATASTRUCT = lParam
    If *copydata\dwData = #pble And *copydata\cbData > 0
    	;     	g_SendFiles$ =
;     	MessageRequester("", PeekS(*copydata\lpData, *copydata\cbData / #CharSize))
    	DropFiles(PeekS(*copydata\lpData, *copydata\cbData / #CharSize))
    	Result = #True
    EndIf
	EndIf
	ProcedureReturn Result
EndProcedure
CompilerEndIf

Отредактировано AZJIO (11.12.2023 05:39:15)

0


Вы здесь » PureBasic - форум » PureBasic для Windows » Как передать данные другой программе?