Вопрос по поводу передачи аргументов
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
Вопрос по поводу передачи аргументов - 2010-10-29 01:12:57.333333
|
|
|
Sunzer
Сообщений: 253
Оценки: 31190
Присоединился: 2007-06-15 19:23:32.436666
|
Имеется функция, в ней первые два параметра должны принимать вид либо число, либо указатель на строку. Как лучше поступить, использовать перегруженые функции? Объявить аргументы void типа, и в ручную пытатся определить адрес это или число. Расчитывается так же на 64 битную архитектуру, и на то что исходный файл может быть в будующем собран в библиотеку. Удобство использования функций на выходе должно быть таким: func(1, 'text_ololo'); func('ololo_1','ololo_2'); func(1,2);
|
|
|
RE: Вопрос по поводу передачи аргументов - 2010-10-29 01:34:44.896666
|
|
|
Sunzer
Сообщений: 253
Оценки: 31190
Присоединился: 2007-06-15 19:23:32.436666
|
Теоритически тогда возможен баг, если большое число передастся, как определить адрес или нет? Все равно это костыли. Четыре почти одинаковых функции писать тоже не вариант, шаблоны тут не заюзаешь.
|
|
|
RE: Вопрос по поводу передачи аргументов - 2010-10-29 12:19:30.903333
|
|
|
Sunzer
Сообщений: 253
Оценки: 31190
Присоединился: 2007-06-15 19:23:32.436666
|
quote:
не перевалит за 2^16 Ну это понятно, при установленом 31 бите, это считается RVA на имя ресурса в Unicode вроде. В 32 битных NT, это адрес должен быть >= 0x80000000, а там ядерная память, конечно если не включен ключ /3GB. В 64 битных там те еще костыли будут с определением, адрес это или нет. Я же говорил что код как под 32 биткой юзатся будет так и под 64 биткой. Перегрузку мне юзать нельзя, так как не возможно будет создать DLL тогда.
|
|
|
RE: Вопрос по поводу передачи аргументов - 2010-10-29 12:47:34.790000
|
|
|
Sunzer
Сообщений: 253
Оценки: 31190
Присоединился: 2007-06-15 19:23:32.436666
|
Вечером приду, надо будет подебажить kernel32.dll && ntdll.dll, посмотреть как MS этот вопрос решила.
|
|
|
RE: Вопрос по поводу передачи аргументов - 2010-10-29 20:19:18.406666
|
|
|
Sunzer
Сообщений: 253
Оценки: 31190
Присоединился: 2007-06-15 19:23:32.436666
|
quote:
Я же писал выше - они анализируют поинтер. Если он меньше или равен 0xFFFF - то id ресурса - число. Иначе - указатель на строку. Тут дебажить ничего не надо, достаточно посмотреть сигнатуры функций по работе с ресурсами. И макросы типа MAKEINTRESOURSE и IS_INTRESOURCE Ну да, судя по таким строчкам кода: quote:
if ( (unsigned int)lpType < 0x10000 ) { v9 = (const WCHAR *)lpType; RtlInitUnicodeString(&v18, 0); } Но, в NT адрес ниже 0x10000 быть не может, про Linux я не знаю, а ведь мой класс должен работать как под Windows так и под Linux. Под Linux данное решение корректное? Хип там не будет случайно находится?
|
|
|
RE: Вопрос по поводу передачи аргументов - 2010-10-29 21:53:47.430000
|
|
|
Sunzer
Сообщений: 253
Оценки: 31190
Присоединился: 2007-06-15 19:23:32.436666
|
quote:
Напиши две функции, одну для строк, другую для интов. Четыре функции, (int,int),(char,char),(int,char),(char,int). Тут даже было бы удобно использовать шаблоны, но это можно юзать только при компиляции, имею ввиду в либу это не превратишь. quote:
Кстати поведение мелкомягкого кода непредсказуемо, если вдруг я передам в него нулевой указатель (получить этот указатель я могу по разным причинам из какого-то левого кода) Для добавления ресурса, это будет ID: 0, для получения, он в древовидной структуре попытается найти ID == 0. Все просто. PS интересные доки: http://skif.bas-net.by/bsuir/lkern/index.HТМL
|
|
|
RE: Вопрос по поводу передачи аргументов - 2010-10-29 22:16:02.960000
|
|
|
Sunzer
Сообщений: 253
Оценки: 31190
Присоединился: 2007-06-15 19:23:32.436666
|
quote:
И какой ресурс будет иметь ID == 0? Какой в голову взбредет. Не запрещено использовать нулевой идентификатор. quote:
1. Ты специально меняешь HТМL на HТМL, чтобы кликающие по твоим линка получали бы 404? Запомни: это только в DOS'е прописные буквы не отличаются от строчных. Ах да, ещё Common Lisp никак не может избавиться от этой болезни. Лично я ничего специально не менял, возможно сам форум, хз, я скопипастил. quote:
2. Это доки по внутренностям ядра. Для прикладного программиста они могут служить лишь развлекательной литературой, но никак не руководством к действию. Ну тебе тогда памятник надо ставить если тебе информация о ядрах – развлекуха. quote:
DOS программисты сделали помойку из DOS'а, перелезли в win, сделали помойку из win. Ты хочешь провернуть то же самое с линём? Зря. Не стоит холивар начинать о Linux и Windows. quote:
Почему? Одну функцию можно превратить в библиотеку, а две нельзя? Перегруженную функцию или шаблонную? Покажи мне экспорт такой DLL, и самое главное как ты такое будешь юзать. Может я тупой совсем.
|
|
|
RE: Вопрос по поводу передачи аргументов - 2010-10-29 23:20:10.430000
|
|
|
Sunzer
Сообщений: 253
Оценки: 31190
Присоединился: 2007-06-15 19:23:32.436666
|
Решил просто добавить два дополнительных параметра в функцию, в итоге код будет один, функция одна. AddResource(0, "123", 0, "123", 1049, &Mem, Size); AddResource(RT_DIALOG, NULL, 0, NULL, 1049, &Mem, Size); Если пользователь захочет добавить символический ресурс, то пускай указывает это, иначе NULL и юзается числовое имя.
|
|
|
RE: Вопрос по поводу передачи аргументов - 2010-10-30 00:38:27.956666
|
|
|
Sunzer
Сообщений: 253
Оценки: 31190
Присоединился: 2007-06-15 19:23:32.436666
|
quote:
Производительность тебя не интересует? Объёмы используемого стека? Производительность упала в миллионы раз, из за того что в стековом кадре выделяется на 8 байтов (16 в x64) больше. Собственно я нихера не понимаю с фига снизится производительность? quote:
Ты мне объясни, чего это тебе так приспичило объединять в одну функцию две разных? Чтобы документация на AddResource не влезала бы в лист формата A4? Документация была бы гораздо лучше, конечно, если бы экспортировалось 4 функции с одинаковым кодом. Там ничего сложного. AddResource(0, "123", 0, "123", 1049, &Mem, Size); 1) ID типа ресурса 2) Символьное имя, у которого приоритет над идентификатором выше. 3) ID имени ресурса. 4) Символьное имя, у которого приоритет над идентификатором выше. 5) Язык ресурса 6) void указатель на данные 7) Размер данных Очень сложная документация? А заюзать можно у себя в проекте подключив мой клас вот так: void func()
{
RESOURCE_WORKER new;
if(new.BeginupdаtеResource("x.exe", true))
{
new.AddResource(RT_STRING, NULL, 0, "MEGA_RES", 1049, Result.Offset, Result.Size);
new.EndupdаtеResource();
}
}
|
|
|
|
|