Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > работа с памятью без CRT


Автор: transserg 2.4.2010, 17:46
привет всем! столкнулся с проблемой... если собираю проект с 
Код
#pragma comment(linker, "/NODEFAULTLIB")

то линкер ругается на отсутствие некоторых функция а именно new, memset,malloc,memcpy;
чем можно их заменить? а точнее как работать с памятью (выделять, освобождать, копировать, перемещать) чисто на WinAPI... ну выделение как я думаю это HeapAlloc,VirtualAlloc,HeapFree,VirtualFree. а как копировать блоки памяти? что можете посоветовать по этому вопросу?

Автор: Sartorius 2.4.2010, 17:58
CopyMemory()

Автор: transserg 2.4.2010, 18:42
Код

#define RtlCopyMemory(Destination,Source,Length) memcpy((Destination),(Source),(Length))
#define CopyMemory RtlCopyMemory

некатит так как использует тот же 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
Цитата(ivanzoid @  2.4.2010,  20:21 Найти цитируемый пост)
в ntdll.dll есть такая функция: _memccpy

  Да уж и не только
Цитата

_wtoi
_wtoi64
_wtol
abs
atan
atoi
atol
bsearch
ceil
cos
fabs
floor
log
mbstowcs
memchr
memcmp
memcpy
memmove
memset
pow
qsort
sin
sprintf
sqrt
sscanf
strcat
strchr
strcmp
strcpy
strcspn
strlen
strncat
strncmp
strncpy
strpbrk
strrchr
strspn
strstr
strtol
strtoul
swprintf
tan
tolower
toupper
towlower
towupper
vsprintf
wcscat
wcschr
wcscmp
wcscpy
wcscspn
wcslen
wcsncat
wcsncmp
wcsncpy
wcspbrk
wcsrchr
wcsspn
wcsstr
wcstol
wcstombs
wcstoul


Так что в системе есть все что нужно.

Автор: transserg 2.4.2010, 22:14
тогда как использовать ту что в ntdll?

Автор: Alexeis 2.4.2010, 22:53
Цитата(transserg @  2.4.2010,  21:14 Найти цитируемый пост)
тогда как использовать ту что в ntdll? 

В WDK(DDK) есть ntdll.lib . Но можно и динамически загрузить при помощи LoadLibrary

  Правда не ясно как обойтись без "new". Без нее вообще никак если писать на С++. Можно попробовать поискать исходники CRT и извлечь оттуда реализацию. Кроме того перестанут работать исключения, RTTI, соответственно dynamic_cast. Т.е. про STL и другие библиотеки можно забыть.

Автор: transserg 2.4.2010, 22:59
Код

#pragma comment(lib, "ntdll.lib")
  
подключил из WDK но все равно 2 ошибки
Код

Error    6    error LNK2001: unresolved external symbol _memset    scnathread.obj
Error    7    error LNK2001: unresolved external symbol _memcpy    main.obj



Добавлено через 33 секунды
может что то еще нужно сделать чтоб он начал использовать их из ntdll?

Автор: Alexeis 2.4.2010, 23:11
transserg, проверь есть ли в либе эти символы. Возможно, они перекрыты дефайнами из заголовков. Может быть соглашение о вызовах не соответствует, поэтому не находит нужную функцию. Например, ожидается __stdcall , а в заголовке описано как __cdecl . Т.е. возможно придется реализовать самому функцию с нужным прототипом вызвав соответствующую функцию из ntdll.dll. 

Автор: transserg 2.4.2010, 23:16
Alexeis а как им образом это можно сделать? (проверить наличие их в либе)
в настройках проекта переключил тип вазова на __stdcall
получил ошибки 
Код

Error    8    error LNK2019: unresolved external symbol _memcpy referenced in function "bool __stdcall ReadSitting(void *)" (?ReadSitting@@YG_NPAX@Z)    main.obj
Error    9    error LNK2001: unresolved external symbol _memcpy    scnathread.obj
Error    10    error LNK2019: unresolved external symbol _memset referenced in function "wchar_t * __stdcall GetFlashVolumSerial(wchar_t *)" (?GetFlashVolumSerial@@YGPA_WPA_W@Z)    scnathread.obj
Error    11    error LNK2001: unresolved external symbol _memset    scnathread.obj


при типе вызова __cdecl (/Gd) тоже самое

Автор: 586 3.4.2010, 01:19
У тебя опция /NODEFAULTLIB блокирует pragma comment.
Отключи опцию NODEFAULTLIB, и вместо main объяви другую точку входа.
Код
#include <windows.h>
#pragma comment (linker, "/entry:MyEntryPoint")
#pragma comment (lib, "ntdll.lib")

int MyEntryPoint()
{
    //...
    return 0;
}

Автор: transserg 3.4.2010, 08:34
 у меня вот так в проекте 
Код

#pragma comment(linker, "/MERGE:.data=.text")
#pragma comment(linker, "/MERGE:.rdata=.text")
#pragma comment(linker, "/SECTION:.text,EWR")
#pragma comment(linker, "/ENTRY:myWinMain")
#pragma comment(linker, "/SUBSYSTEM:WINDOWS" )
#pragma optimize( "gsy", on )
#pragma comment(linker, "/NODEFAULTLIB") 
#pragma comment(linker, "/INCREMENTAL:NO" ) 
#pragma comment(lib, "ntdll.lib" ) 

586 хотите сказать что если я спользую 
#pragma comment(linker, "/NODEFAULTLIB") то #pragma comment(lib, "ntdll.lib" )  небудет работать?

Автор: Alexeis 3.4.2010, 09:40
Цитата(586 @  3.4.2010,  00:19 Найти цитируемый пост)
У тебя опция /NODEFAULTLIB блокирует pragma comment.

Может тогда ограничить ее действие только на одну библиотеку?

Код

#pragma comment(linker, "/NODEFAULTLIB:libcmt.lib") 



Автор: transserg 3.4.2010, 10:22
Alexeis вот теперь заработало!  smile 
сейчас проверял если без 
Код

#pragma comment(linker, "/NODEFAULTLIB")

но с 
Код

#pragma comment(lib, "ntdll.lib" )

то функции берутся из ntdll
всем спасибо за помощь думаю вопрос решен!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)