|
nedoPC.orgElectronics hobbyists community established in 2002 |
|
Перегруженные функции в C++
Author |
Message |
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
А где я его буду хранить в dll-ке между вызовами? Она ж "кучу" создает и сама её и "рассыпает" потом...
_________________ iLavr
|
19 Jan 2018 21:35 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22583 Location: Silicon Valley
|
а у тебя DLL-ка только в момент обращения к порту создается чтоль? и дисплей твой то потухнет, то погаснет?
|
19 Jan 2018 21:54 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Мне кажется, что вызов экспортирумой ф-ции DLL - не в потоке окна, созданного DLL-кой. Он в потоке ехе-файла, который эту DLL-ку вызвал, поэтому переменные окна недоступны вызываемой из DLL ф-ции.
_________________ iLavr
|
19 Jan 2018 22:06 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Вот здесь, как мне кажется, излагают эту бадью про "общую область": Честно говоря, опять нифига не понял...
_________________ iLavr
|
20 Jan 2018 17:55 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
И вот здесь ещё излагают похожую историю: Разделяемая память в DLL | | | | Quote: В Win32 библиотека DLL располагается в области памяти загружающего ее процесса. Каждому процессу предоставляется отдельная копия “глобальной” памяти DLL ( т.е делается отдельная копия всех глобальных переменных, объявленных в исходном коде этой DLL), которая реининиализируется каждый раз, когда новой процесс загружает библиотеку. Это означает, что в Win32 динамическая библиотека, вернее, ее глобальные переменные, не могут использоваться процессами совместно. И все же, выполнив ряд замысловатых манипуляций над сегментом данных DLL, можно создать общую область памяти для всех процессов, использующих данную библиотеку. Допустим, имеется массив целых чисел, который должен использоваться всеми процессами, загружающими некоторую библиотеку DLL. Это можно запрограммировать в коде библиотеки следующим образом: Все инициализированные переменные, объявленные между директивами #pragma data_seg (), размещаются в сегменте .MySeg. Важно специально инициализировать эти переменные, в противном случае компилятор помещает эти переменные вместо области памяти .MySeg в обычную неинициализируемую область. · Директива #pragma comment () – не обычный комментарий. Она дает указание библиотеке времени выполнения системы C пометить новый раздел как разрешенный для чтения, записи и совместного доступа (rws). | | | | |
_________________ iLavr
|
20 Jan 2018 18:11 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22583 Location: Silicon Valley
|
Ну тут по видимому оно должно с обеих сторон быть поддержано, а так как ты "внедряешься" в чужой EXE, то соответственно он со своей стороны это поддержать не может...
|
20 Jan 2018 18:57 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Я тут подумал, надо, видимо, сделать всё несколько иначе... В вызываемой из DLL функции послать окну сообщение через PostMessage. и передать ему вот этот ( INT arg), который записывается в порт 177714о. Окно свой hwnd знает всегда, отрисует всё что надо по INT arg в своей очереди сообщений, а главное - запомнит этот INT arg! Тогда, когда надо будет возобновить испорченную клиентскую область по сообщению Венды, вот здесь придется всего лишь повторить последнюю отрисовку по значению INT arg. Мне думается, так будет проще. В противном случае где-то надо запоминать всю клиентскую область как контекст окна и выводить его заново, если окно "испорчено" другими окнами. Ибо просмотрел я интернет, что-то ни у кого не получлось сделать этот " shared segment in a dll". Не первый раз я с этим сталкиваюсь, но видимо, время победить эту проблему пока не пришло. К "инжекции в код" я тоже не раз подступался, но корректно под Вендой получилось впервые...
_________________ iLavr
|
21 Jan 2018 14:02 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Shaos, тут такой вот вопрос возник, я не знаю, как это С++ делает... Ну, скажем, у меня всё та же функция в dll-библиотеке: Если я вызываю её из кода, скажем, как обычно: На ассемблере это выглядит вот так: Если я теперь в вызываемой функции напишу: То по выходу из функции значение (INT arg) будет изменено прямо в стеке, где оно передается?
_________________ iLavr
|
24 Jan 2018 20:48 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Чисто опытным путём получается, что аргумент, переданный по значению вызываемая функция не изменяет. Написал для теста вот такую функцию: С++ компилирует её в следующий ассемблерный код : То есть все манипуляции проводились с копией arg, его значение, переданное в стеке, не изменилось.
_________________ iLavr
|
25 Jan 2018 08:17 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Но если хорошо подумать, то, пожалуй, можно это и сделать... Поскольку С++ компилирует функцию с одним аргументом в следующий ассемблерный код : то всё, что нам надо сделать после манипуляций с копией аргумента в eax - это: Я не знаю, как это сделать в терминах С++, но на ассемблере это делается элементарно. В крайнем случае можно сделать фиктивную оперцию - ну хоть тот-же Sleep - а потом пропатчить эту часть кода как mov [esp][00004],eax.
_________________ iLavr
|
25 Jan 2018 19:08 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Shaos, двумерный массив в С++ можно как-то инициаллизировать сразу при объявлении его одной строкой? Он мне нужен как глобальный и сразу проинициаллизированный нулями.
_________________ iLavr
|
29 Jan 2018 22:46 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22583 Location: Silicon Valley
|
Угу: | | | | Code: word keyArray[4][13] = { {0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0} };
| | | | |
|
30 Jan 2018 05:33 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
| | | | Shaos wrote: | | | | Code: word keyArray[4][13] = { {0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0} }; | | | | |
| | | | |
Спасибо!... что-то я сам не допер...
_________________ iLavr
|
30 Jan 2018 11:38 |
|
|
Who is online |
Users browsing this forum: No registered users and 73 guests |
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot post attachments in this forum
|
|