| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > работа с памятью без CRT |
| Автор: transserg 2.4.2010, 17:46 | ||
привет всем! столкнулся с проблемой... если собираю проект с
то линкер ругается на отсутствие некоторых функция а именно new, memset,malloc,memcpy; чем можно их заменить? а точнее как работать с памятью (выделять, освобождать, копировать, перемещать) чисто на WinAPI... ну выделение как я думаю это HeapAlloc,VirtualAlloc,HeapFree,VirtualFree. а как копировать блоки памяти? что можете посоветовать по этому вопросу? |
| Автор: Sartorius 2.4.2010, 17:58 |
| CopyMemory() |
| Автор: transserg 2.4.2010, 18:42 | ||
некатит так как использует тот же memcpy |
| Автор: GoldFinch 2.4.2010, 19:58 |
| transserg, ну значит убери этот дефайн, чтобы оно брало нужную функцию |
| Автор: transserg 2.4.2010, 19:59 |
| GoldFinch в том то и дело что я хочу от CRT отказаться чтоб его небыло в моем проекте... а все упирается в работу с памятью |
| Автор: ivanzoid 2.4.2010, 21:21 |
| transserg, в ntdll.dll есть такая функция: _memccpy |
| Автор: Alexeis 2.4.2010, 22:11 | ||
Да уж и не только
Так что в системе есть все что нужно. |
| Автор: transserg 2.4.2010, 22:14 |
| тогда как использовать ту что в ntdll? |
| Автор: Alexeis 2.4.2010, 22:53 |
В WDK(DDK) есть ntdll.lib . Но можно и динамически загрузить при помощи LoadLibrary Правда не ясно как обойтись без "new". Без нее вообще никак если писать на С++. Можно попробовать поискать исходники CRT и извлечь оттуда реализацию. Кроме того перестанут работать исключения, RTTI, соответственно dynamic_cast. Т.е. про STL и другие библиотеки можно забыть. |
| Автор: transserg 2.4.2010, 22:59 | ||||
подключил из WDK но все равно 2 ошибки
Добавлено через 33 секунды может что то еще нужно сделать чтоб он начал использовать их из ntdll? |
| Автор: Alexeis 2.4.2010, 23:11 |
| transserg, проверь есть ли в либе эти символы. Возможно, они перекрыты дефайнами из заголовков. Может быть соглашение о вызовах не соответствует, поэтому не находит нужную функцию. Например, ожидается __stdcall , а в заголовке описано как __cdecl . Т.е. возможно придется реализовать самому функцию с нужным прототипом вызвав соответствующую функцию из ntdll.dll. |
| Автор: transserg 2.4.2010, 23:16 | ||
| Alexeis а как им образом это можно сделать? (проверить наличие их в либе) в настройках проекта переключил тип вазова на __stdcall получил ошибки
при типе вызова __cdecl (/Gd) тоже самое |
| Автор: 586 3.4.2010, 01:19 | ||
| У тебя опция /NODEFAULTLIB блокирует pragma comment. Отключи опцию NODEFAULTLIB, и вместо main объяви другую точку входа.
|
| Автор: transserg 3.4.2010, 08:34 | ||
у меня вот так в проекте
586 хотите сказать что если я спользую #pragma comment(linker, "/NODEFAULTLIB") то #pragma comment(lib, "ntdll.lib" ) небудет работать? |
| Автор: Alexeis 3.4.2010, 09:40 | ||
Может тогда ограничить ее действие только на одну библиотеку?
|
| Автор: transserg 3.4.2010, 10:22 | ||||
| Alexeis вот теперь заработало! сейчас проверял если без
но с
то функции берутся из ntdll всем спасибо за помощь думаю вопрос решен! |