Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» C++ WinAPI

Автор: plazzmex
Дата сообщения: 18.06.2007 14:56
а у тебя меню в resource файле ?
наверное я тоже попробую сделать в ресорсе и посмотрю.. может заработает...

добавлено:

УУУУРРАААА !!!!
получилось !
огромное спасибо за помощь !!!!!!!
Автор: Qraizer
Дата сообщения: 19.06.2007 12:54
Нет, меню создавалось програмно. Но один раз при старте.
Автор: plazzmex
Дата сообщения: 19.06.2007 13:28
Qraizer

Цитата:
Нет, меню создавалось програмно. Но один раз при старте.

как ? в WM_CREATE ???
Автор: Qraizer
Дата сообщения: 19.06.2007 21:22
Именно. Если вызывать TrackPopupMenu(), то меню может быть "свободным", т.е. не указываться ни к какому классу окна. TrackPopupMenu() работает сама по себе, и при необходимости hwnd можно указать прям в её вызове.
Автор: plazzmex
Дата сообщения: 20.06.2007 22:19
Qraizer

Цитата:
Именно. Если вызывать TrackPopupMenu(), то меню может быть "свободным", т.е. не указываться ни к какому классу окна. TrackPopupMenu() работает сама по себе, и при необходимости hwnd можно указать прям в её вызове.

аа.. понятно.
спасибо за помощь

Добавлено:
есть еще маленький вопрос..
по записи в реестр.
я разные настройки сохраняю в реестр и все работает а вот в Run реестра не получилось.. точнее запись идет но программа не запускается при старте виндовса..
а если запускается то сразу удаляется из реестра хотя ключ я записывал не в RunOnce а Run !

вот код:

Код:
case ID_CONTEXT_AUTORUN:
{
HKEY hIndAutoRun;
SECURITY_ATTRIBUTES sa = {sizeof(sa), 0,1};
DWORD state = 0;
RegCreateKeyEx (HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, NULL, 0, KEY_ALL_ACCESS, &sa, &hIndAutoRun, &state );
GetCurrentDirectory (MAX_PATH + 1, szBuffer)
if (SearchPath(szBuffer, "Autorunp.exe", NULL, MAX_PATH + 1, szFile, (LPTSTR*) &_FileName) == 0)
{
MessageBox(hwnd, "The File name was changed! The Autorun function is disabled now!\n\nTo enable it rename the file back to - 'Autorunp.exe'", "File Name Was Changed !", MB_OK | MB_ICONWARNING);
}
else
{
RegSetValueEx(hIndAutoRun, "autorunp", 0, REG_SZ, (LPBYTE) szFile, sizeof(szFile) );
}
RegCloseKey(hIndAutoRun);
}
break;
Автор: ShIvADeSt
Дата сообщения: 21.06.2007 00:58
вот так примерно

Код:
procedure SetAutoRun(AutoRun:boolean);
var
Key :HKEY;
ValType WORD;
Size,Res WORD;
Path :String;
begin
Path:='Software\Microsoft\Windows\CurrentVersion\Run';
if RegOpenKeyEx(HKEY_CURRENT_USER,PChar(Path),0,KEY_SET_VALUE,Key)<> ERROR_SUCCESS then
RegCreateKeyEx(HKEY_CURRENT_USER,PChar(Path),0,nil,0,KEY_SET_VALUE,nil,Key,@Res);
ValType:=REG_SZ;
Size:=Length(ParamStr(0));
if AutoRun then RegSetValueEx(Key,'KeyFiller',0,ValType,PChar(ParamStr(0)),Size)
else RegDeleteValue(Key,'KeyFiller');
RegCloseKey(Key);
end;
Автор: plazzmex
Дата сообщения: 21.06.2007 12:02
ShIvADeSt
а это на с++ ?
а то я не знаю с++ (я знаю с)
и спасибо.. попробую.
Автор: plazzmex
Дата сообщения: 21.06.2007 21:11
ничего не получилось ..
где можно найти, или может у когото есть пример программы на С и WinApi которая записывается в Autorun реестра?

помогите пожалуйста

добавленно:
ой.. а почему оно не прикрепило это сообщение кпрошлому?
Автор: vjunk
Дата сообщения: 21.06.2007 22:16
plazzmex
у меня такой код работает (компилируется MinGW):

Код:
#define STRICT
#include <windows.h>

static char *AutoLoadKey="SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";

char *GetExePath(void)
{
char *program;

program=malloc(MAX_PATH);
if(NULL==program)
return NULL;
if(0==GetModuleFileName(NULL, program, MAX_PATH))
{
free(program);
return NULL;
}
return program;
}

void AddAutoLoad(char *name)
{
HKEY key;
DWORD action;
char *program;

program=GetExePath();
if(NULL==program)
return;

if(ERROR_SUCCESS==RegCreateKeyEx(HKEY_CURRENT_USER, AutoLoadKey,
0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
&key, &action)
)
{
RegSetValueEx(key, name, 0,
REG_SZ, (LPBYTE)program, lstrlen(program)+1);
RegCloseKey(key);
}
free(program);
}

int main(void)
{
AddAutoLoad("my_autorun");
return 0;
}
Автор: plazzmex
Дата сообщения: 22.06.2007 18:04
vjunk
спасибо..

Цитата:
у меня такой код работает

но..., он при загрузки виндовса после загрузки программы сразу удаляется из реестра !
почему ?
Автор: Lyrik
Дата сообщения: 22.06.2007 23:02
plazzmex
а попробуй вручную создать ключ, через регедит, например, и перезагрузить. он удалится или нет? может у тя стоят какие-то ограничения.
Автор: vjunk
Дата сообщения: 24.06.2007 22:51
plazzmex
Какой-то антивирус/файервол/вирус/адваре/спайваре у тебя чистит реестр.
Разбирайся со своей системой.
Можешь в VMware поставить чистую винду без доп. программ и там проверить.
Кстати, ты уверен, что это не твоя-же программа после загрузки по ошибке удаляет ключ?
Автор: MrZeRo
Дата сообщения: 05.07.2007 14:53
Я пишу Shell Extension для Explorer, это dll, и у меня имеется необходимость загрузить из этой dll панель диалога. Для этого надо указать hInstance моей загруженной dll. Но я никак не могу ее определить, и даже не могу определить полный путь, по которому она лежит на диске! GetModulwFileName(NULL,...) дает explorer.exe, если брать hInstance из WINAPI DllMain(HINSTANCE hInstance, ... , то опять дает explorer.exe.
Как бы решить такую проблему? Т.е. определить либо hInstance, либо полный путь к dll, которая является Shell Extension.
Автор: vshersh
Дата сообщения: 05.07.2007 15:29
MrZeRo
HINSTANCE, соответствующий твоей длл-ке передается в DllMain:

Код:
BOOL WINAPI DllMain(
HINSTANCE hinstDLL,
DWORD fdwReason,
LPVOID lpvReserved
);
Автор: MrZeRo
Дата сообщения: 05.07.2007 15:36
Это я попробовал:

Цитата:
если брать hInstance из WINAPI DllMain(HINSTANCE hInstance, ... , то опять дает explorer.exe

не получилось.
Тут вроде нарыл способ - через VirtualQuery, вроде работает, но как-то слишком мудрено.
Автор: RedLord
Дата сообщения: 05.07.2007 16:48
MrZeRo

заведи статическую переменную в dll
возьми ее адрес и выравняй его или
попробуй GetModuleHandleEx (флаг - GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS. она позволяет получить по адресу внутри модуля)
Автор: MrZeRo
Дата сообщения: 05.07.2007 17:01
С VirtualQuery идея та же. Там берется статическая переменная или функция, скармливается ее адрес и получается потом HInstance.

Цитата:

static int DUMMY;
MEMORY_BASIC_INFORMATION mbi;
VirtualQuery(&DUMMY, &mbi, sizeof(mbi));
(HMODULE)mbi.AllocationBase; // то, что надо

Спасибо за помощь! Давно на чистом API ничего не писал, немного растерялся ...
Автор: vshersh
Дата сообщения: 05.07.2007 17:24
MrZeRo
Специально попробовал:
Код в Длл

Код:
static HANDLE glhModule;


BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
                     )
{
glhModule = hModule;
    return TRUE;
}


...
//экспортируемая функция
[no]    
    TCHAR fn[MAX_PATH];
    
    GetModuleFileName((HINSTANCE)glhModule, fn, MAX_PATH);
    MessageBox(0, fn, NULL, MB_OK);
[/no]
Автор: Abs62
Дата сообщения: 05.07.2007 17:39
MrZeRo

Цитата:
С VirtualQuery идея та же. Там берется статическая переменная или функция, скармливается ее адрес и получается потом HInstance.

А есть ещё GetMappedFileName, которой можно скормить адрес и получить имя файла.
Автор: MrZeRo
Дата сообщения: 06.07.2007 08:15
vshersh
Ну, не работает так! Когда искал информацию по этой теме по форумам, у половины это работает, а у половины не работает, а ничего другого там не предлагалось. Видимо, от каких-то настроек Windows зависит. Я тоже брал из этого места:
Цитата:

// DLL Entry Point
extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
    hInstance;
return _AtlModule.DllMain(dwReason, lpReserved);     
}

Оно дает explorer.exe (по крайней мере, у меня).
Может, как-то влияет то, что это не просто dll, а Shell Extension, может, explorer ее загружает как-то хитро ...
Abs62
Тоже отлично, но мне именно HMODULE в принципе нужен, тогда грузить не придется еще раз эту dll.
Автор: Abs62
Дата сообщения: 06.07.2007 08:42
MrZeRo
GetModuleHandle dll не грузит (это я на случай, если через VirtualQuery всё ещё кажется слишком мудрёно ).
Автор: koderr
Дата сообщения: 17.07.2007 05:09
Как можно определить, запущена ли программа из командной строки или нет? Т.е. хочется в зависимости от subsystem использовать printf и MessageBox. Программа изначально слинкована с ключом /SUBSYSTEM:WINDOWS, т.е. консольное окошко не выскакивает.

Пробую получать
Код: hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
Автор: Qraizer
Дата сообщения: 17.07.2007 13:01
Что-то я не осилил суть проблемы... По-любому ИМХО лучше юзать функцию GetConsoleWindow().
Автор: koderr
Дата сообщения: 17.07.2007 14:38
Qraizer
Проблема сейчас такая: есть win32 приложение (не консольное). Если запускать его из командной строки, то не работают puts, printf и подобные; кроме того, cmd не ждет завершения моей программы, а сразу выдает command prompt (попробуйте запустить, например, calc.exe из-под cmd).
Автор: Qraizer
Дата сообщения: 18.07.2007 13:36
Ага. Теперь понятно. Всё правильно - это поведение по умолчанию для GUIных приложений, ИМХО правильное. Консольный ввод/вывод не работает по причине того, что для неконсольных приложений системой не создаётся консольное окно и не распределяются стандартные handleы. Однако GUIное приложение может само это всё сделать. Смотри в AllocConsole() и по ссылкам найдёшь всё остальное, если интересно.
Автор: plazzmex
Дата сообщения: 11.08.2007 17:56
ребята помогите.
кто сталкивался спроблемой

Код: `INITCOMMONCONTROLSEX' undeclared (first use in this function)
Автор: general29
Дата сообщения: 16.10.2007 23:37
какое сообщение получает окно, когда теряет фокус, становится неактивным?
Автор: Abs62
Дата сообщения: 16.10.2007 23:44
general29
WM_KILLFOCUS
Автор: Lyrik
Дата сообщения: 17.10.2007 00:09
general29
Abs62 + WM_ACTIVATEAPP
Автор: Abs62
Дата сообщения: 17.10.2007 08:12
Lyrik
Это при переключении между приложениями. Тогда уж WM_ACTIVATE.
MSDN: About Keyboard Input

Страницы: 12345678910111213141516171819202122232425262728293031323334353637

Предыдущая тема: посоветуйте книги по SQL


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.