Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

IntToStr без System.pas [D7, WinXP]


Страницы:   1 2 3

diimon ©   (2007-09-04 07:18:00) 

у меня проблема: хочу написать маленькое приложение(модули System.pas и SysInit.pas обрезаны)
мне необходимы функции IntToStr и StrToInt, но я не знаю как их теперь реализовать, думал выдернуть их из оригинального System.pas, но там одна функция тянет за собой другую... вообщем ничего у меня не выходит. Что делать??(Ассемблер я к сожалению почти не знаю :(  )


Сергей М.   (2007-09-05 08:39:00) [21]


> diimon   (05.09.07 08:21) [30]


Это ты сам придумал так кастрировать сист.юниты или кто-то тебе посоветовал ?)


diimon   (2007-09-05 08:21:00) [22]

содержимое sysinit.pas

unit SysInit;

interface
procedure _InitExe;
procedure _halt0;
procedure _InitLib(Context: PInitContext);

var
 ModuleIsLib: Boolean;        
 TlsIndex: Integer = -1;      
 TlsLast: Byte;

const
 PtrToNil: Pointer = nil;  

implementation

procedure _InitLib(Context: PInitContext);
asm
end;

procedure _InitExe;
asm
end;

procedure _halt0;
asm
end;

end.


содержимое system.pas

unit System;

interface

procedure _HandleFinally;

type
TGUID = record
 D1: Cardinal;
 D2: Word;
 D3: Word;
 D4: array [0..7] of Byte;
end;

PInitContext = ^TInitContext;
TInitContext = record
   OuterContext:   PInitContext;  
   ExcFrame:       Pointer;          
   InitTable:      pointer;    
   InitCount:      Integer;          
   Module:         pointer;      
   DLLSaveEBP:     Pointer;
   DLLSaveEBX:     Pointer;
   DLLSaveESI:     Pointer;  
   DLLSaveEDI:     Pointer;  
   ExitProcessTLS: procedure;    
   DLLInitState:   Byte;            
end;

implementation

procedure _HandleFinally;
asm
end;

end.


по поводу
> homm ©   (05.09.07 08:00) [28]


компилер выдает System unit out of date or corrupted: missing '@LStrFromPChar'


homm   (2007-09-05 08:12:00) [23]

Вот тебе еще, послаще малек.

function Int2Str( Value : Integer ) : String;
asm
       XOR       ECX, ECX
       PUSH      ECX
       ADD       ESP, -0Ch

       PUSH      EBX
       LEA       EBX, [ESP + 15 + 4]
       PUSH      EDX
       CMP       EAX, ECX
       PUSHFD
       JGE       @@1
       NEG       EAX
@@1:
       MOV       CL, 10

@@2:
       DEC       EBX
       XOR       EDX, EDX
       DIV       ECX
       ADD       DL, 30h
       MOV       [EBX], DL
       TEST      EAX, EAX
       JNZ       @@2

       POPFD
       JGE       @@3

       DEC       EBX
       MOV       byte ptr [EBX], '-'
@@3:
       POP       EAX
       MOV       EDX, EBX
       CALL      System.@LStrFromPChar

       POP       EBX
       ADD       ESP, 10h
end;


И вот сюда загляни, там замны систепмных модулей вские фокусы не вытворяют.
http://kolnmck.ru/files1.shtml


homm   (2007-09-05 08:00:00) [24]

Слышь, дятел, зачем ты ветку завел, если все равно не читаешь, что тебе пишут? Сто раз сказано, в KOL глянь. Дак чукча же не читатель, он пойдет еше фигни наспрашивает лучше, чем совету последовать.

function Int2Str( Value : Integer ) : String;
var Buf : array[ 0..15 ] of Char;
   Dst : PChar;
   Minus : Boolean;
   D: DWORD;
begin
 Dst := @Buf[ 15 ];
 Dst^ := #0;
 Minus := False;
 if Value < 0 then
 begin
   Value := -Value;
   Minus := True;
 end;
 D := Value;
 repeat
   Dec( Dst );
   Dst^ := Char( (D mod 10) + Byte( '0' ) );
   D := D div 10;
 until D = 0;
 if Minus then
 begin
   Dec( Dst );
   Dst^ := '-';
 end;
 Result := Dst;
end;

procedure Int2PChar( s: PChar; Value: Integer );
var Buf : array[ 0..15 ] of Char;
   Dst : PChar;
   Minus : Boolean;
   D: DWORD;
begin
 Dst := @Buf[ 15 ];
 Dst^ := #0;
 Minus := False;
 if Value < 0 then
 begin
   Value := -Value;
   Minus := True;
 end;
 D := Value;
 repeat
   Dec( Dst );
   Dst^ := Char( (D mod 10) + Byte( '0' ) );
   D := D div 10;
 until D = 0;
 if Minus then
 begin
   Dec( Dst );
   Dst^ := '-';
 end;
 StrCopy( s, Dst );
end;

function UInt2Str( Value: DWORD ): String;
var Buf : array[ 0..15 ] of Char;
   Dst : PChar;
   D: DWORD;
begin
 Dst := @Buf[ 15 ];
 Dst^ := #0;
 D := Value;
 repeat
   Dec( Dst );
   Dst^ := Char( (D mod 10) + Byte( '0' ) );
   D := D div 10;
 until D = 0;
 Result := Dst;
end;


diimon   (2007-09-05 07:43:00) [25]

слыш, homm ©, если тебе нечего ответить по вопросу, нахера ты ваще чето пишешь?? Флейм тут тока разводишь.
Удалил потому что она тянет за собой другую функцию, та тянет третью и так далее до бесконечности. А мне требуется просто переписать ее заново, вот и все. Не знаешь как это сделать- не пиши вообще!!!


homm   (2007-09-04 15:44:00) [26]

Закалебал. Нафига ты удалил эти функции из системного модуля, елс иони тебе нужны? Давай еше спрости, как мне работать в виндовс, который я стер, или как кататься в автомобиле, который я продал. Востанови хотя-бы те функции, которые тебе нужны.


Anatoly Podgoretsky   (2007-09-04 15:29:00) [27]

> sniknik  (04.09.2007 15:26:24)  [24]

Что по сути одно и тоже.


sniknik   (2007-09-04 15:26:00) [28]

> Упс, у тебя порушеная Дельфи
не, это просто неправильно порезанный System, дельфи тут не причем. (получал что то подобное при компилировании примера из какой то статьи по "минимизированному exe")
восстанавливается возвращением сохранённых оригиналов.


clickmaker   (2007-09-04 15:19:00) [29]


> [21] diimon   (04.09.07 15:17)

операция обрезания прошла неудачно. Пациент умер от болевого шока


Anatoly Podgoretsky   (2007-09-04 15:19:00) [30]

Упс, у тебя порушеная Дельфи


diimon   (2007-09-04 15:17:00) [31]


> clickmaker ©   (04.09.07 14:57) [20]
> function MyIntToStr(N: int64): string;var M: integer;begin
>  Result := '';  while N > 0 do begin    M := N mod 10;  
>  N := N div 10;    Result := Chr(M + 48) + Result;  end;
> end;StrToInt - домашнее задание

Компилятор ругается...
System unit out of date or corrupted: missing '@LStrClr'
:(


clickmaker   (2007-09-04 14:57:00) [32]

function MyIntToStr(N: int64): string;
var M: integer;
begin
 Result := '';
 while N > 0 do begin
   M := N mod 10;
   N := N div 10;
   Result := Chr(M + 48) + Result;
 end;
end;

StrToInt - домашнее задание


tmp   (2007-09-04 14:49:00) [33]

Да, не заметил


homm   (2007-09-04 14:03:00) [34]

> У меня  D7, WInXp…
… и стойкое нежелание читать ветку?


sniknik   (2007-09-04 14:03:00) [35]

> У меня на D7, WInXp все работает
ну у тебя же не обрезанный system. нет уж... сначала ты должен выкинуть процедуру Str (вместе с остальным) а потом проверять.


Dib@zol   (2007-09-04 14:00:00) [36]

> [15] tmp   (04.09.07 13:53)

А ты попробуй отчекрыжить sysInit.pas/dcu и удивись :)


tmp   (2007-09-04 13:53:00) [37]


> diimon   (04.09.07 13:14) [11]
>
>
> > tmp   (04.09.07 08:19) [1]
> > function IntToStr(N: Int64): string;begin  Str(N,Result);
>
> > end;
>
>
> Компилятор ругается на эту строку "Str(N,Result);"
>
> System unit out of date or corrupted: missing '@str0int64'
>


У меня на D7, WInXp все работает


program Project1;

uses
 Windows;

function IntToStr(N: Int64): string;
begin
 Str(N,Result);
end;

begin
 MessageBox(0,PChar(IntToStr(High(Int64))),'Test',0);
end.


homm   (2007-09-04 13:26:00) [38]

> [13] diimon   (04.09.07 13:23)

См. в сторону KOL.


diimon   (2007-09-04 13:23:00) [39]

а на ассемблере как написать функцию
IntToStr и обратно?? мож у кого есть какие нить наработки??


homm   (2007-09-04 13:17:00) [40]

Смотри в сторону [6].


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо