Autor Téma: jiné chování programu při spuštění s IDE a jiné z příkazového řádku  (Přečteno 3490 krát)

Offline frankee

  • Příspěvků: 16
  • Karma: 3
ahoj,
pokud spustím program z IDE, neproběhne žádná inicializace soketů. Pro komunikaci používám Synapse 4.0
(z turbo delphi to na tomtéž jede v pohodě) z delphi XE to háže chybu. (práva ?)
systém mám win 7/64bit.

Kód: [Vybrat]
rcvsock:=TUDPBlockSocket.Create;
 rcvsock.createsocket;
 if rcvsock.LastError<>0 then showMessage( 'Chyba vytvoreni soketu.');
 rcvsock.EnableReuse(true);
 rcvsock.Bind( string(IP), string(UDPPort));
 if rcvsock.LastError<>0 then showMessage( 'Chyba svazani soketu,  port:'+UDPPort); // ZDE HODI PRVNI CHYBU
 rcvsock.EnableBroadcast(true);
 if rcvsock.LastError<>0 then showMessage( 'Chyba povoleni broadcastu.');  // ZDE DRUHOU
 RcvSock.NonBlockMode := true;

pokud spustím program samostatně, všecko funguje dobře.

už jste se s tím setkali  ?
Petr

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1412
  • Karma: 34
    • Pepak.net
Ne konkrétně s touto chybou, ale když vidím ten kód, tak bych si tipnul, že bude problém s
Kód: Delphi [Vybrat]
  1. rcvsock.Bind( string(IP), string(UDPPort));
a to konkrétně s tím přetypováním na string - různé verze Delphi se k tomu chovají poněkud jinak v závislosti na tom, co je vstupní typ, a třeba Delphi 5 na podobné konstrukci umí přepsat paměť a následně spadnout s Access Violation. Začal bych tedy s tím, že bych to přepsal na pevně danou adresu a port:
Kód: Delphi [Vybrat]
  1. rcvsock.Bind( '0.0.0.0', '12345');
a až bych si ověřil, že to magicky začalo fungovat ve všech Delphi, tak bych tam vrátil původní kód a podíval se v CPU View, v čem se liší vygenerovaný kód v jednotlivých Delphi.

Offline frankee

  • Příspěvků: 16
  • Karma: 3
odzkoušeno,

tím to není. Zkusil jsem dát Bind( '0.0.0.0',3000 ); a furt to dělá. Spíš mě zajímá jak to, že když to spustím z příkazové rádky, jede to. Když z IDE, nejede to.IP a UDPPort jsem převedl na wide stringy (to jsou vstupni parametry ve verzi XE. Výsledek pořád stejný.


Offline pepak

  • Guru
  • *****
  • Příspěvků: 1412
  • Karma: 34
    • Pepak.net
Když to spouštíš v IDE, tak to nejspíš spouštíš v debugovacím režimu a jsou ostřejší kontroly např. ze strany správce paměti.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2309
  • Karma: 102
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Co firewall? Zkus ho na chvilku uplne vypnout.

Embarcadero MVP - Czech republic

Offline frankee

  • Příspěvků: 16
  • Karma: 3
to jsem zkusil dřív než jsem sem psal,

co jsem zkusil ještě:

- run without debugging... Chyba také nastane
- zkompilovat s bpl balíčky samostatně.... Chyba také nastane

trochu mi to přijde jako vlastnost toho, že jsem konvertoval projekt ze staré verze Turbo delphi. (ale to je trochu paranoia)
 

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2309
  • Karma: 102
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Co ti rekne rcvsock.LastErrorDesc ?

Nekdy chvilku trva, než se laicky řečeno minulé Bind uvolní, zvláště pokud to sestřelíš z IDE.
Embarcadero MVP - Czech republic

Offline frankee

  • Příspěvků: 16
  • Karma: 3
pred zavolanim cehokoli je tam prazdno,
po zavolani toho je tam 'socket operation on nonsocket'
Zastavi se to na 
rcvsock.Bind( IP, UDPPort); //  IP= ansi string = '0.0.0.0'   UDPort= wide string = '3000'
každopádně mě to někam posunulo, takže díky...
akorát furt nechápu že uvnitř IDE to neproběhne v pořádku (ani bez debuggeru) a vně IDE to dopadne dobře...


Petr

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2309
  • Karma: 102
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
No a když to krokuješ dovnitř tak to selže kdy?
Embarcadero MVP - Czech republic

Offline frankee

  • Příspěvků: 16
  • Karma: 3
když to krokuju dovnitř, tak to selže
v teto metode

Kód: Delphi [Vybrat]
  1.  
  2.  
  3. procedure TBlockSocket.InternalCreateSocket(Sin: TVarSin);
  4. begin
  5.   FStopFlag := False;
  6.   FRecvCounter := 0;
  7.   FSendCounter := 0;
  8.   ResetLastError;
  9.   if FSocket = INVALID_SOCKET then
  10.   begin
  11.     FBuffer := '';
  12.     FBinded := False;
  13.     FIP6Used := Sin.AddressFamily = AF_INET6;
  14.     FSocket := synsock.Socket(integer(Sin.AddressFamily), GetSocketType, GetSocketProtocol);
  15.     if FSocket = INVALID_SOCKET then
  16.       FLastError := synsock.WSAGetLastError;                                                                  // tady uz to ma chybu 10106
  17.     {$IFNDEF CIL}
  18.     FD_ZERO(FFDSet);
  19.     FD_SET(FSocket, FFDSet);
  20.     {$ENDIF}
  21.     ExceptCheck;
  22.     if FIP6used then
  23.       DoStatus(HR_SocketCreate, 'IPv6')
  24.     else
  25.       DoStatus(HR_SocketCreate, 'IPv4');
  26.     ProcessDelayedOptions;
  27.     DoCreateSocket;
  28.   end;
  29. end;
  30.  


Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2309
  • Karma: 102
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Zkus napsat minimální program - nejlépe konzolovou verzi, pár řádků a přidej tam i zdrojáky synapse co používáš a zkus mi to poslat na radekc@delphi.cz
Embarcadero MVP - Czech republic

Offline frankee

  • Příspěvků: 16
  • Karma: 3
při vytváření dema to funguje tak jak má...

ale v tom velkém projektu to pořád nefunguje dobře...
ještě to zkusím osekat tak aby to mělo vlastnosti chyby a
dál nevím,
Petr


Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2309
  • Karma: 102
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Zkus full debug mode u FastMM, třeba si někde jen přepisuješ paměť

http://delphi.cz/post/Detekce-problemu-za-pomoci-FastMM4.aspx
Embarcadero MVP - Czech republic