HTML sayfalarını arşiv olarak kaydetmek(MHTML)
function SaveToMHT(const AUrl, AFileName: string;
AShowErrorMessage: Boolean = False): Boolean;
var
oMSG, oConfig: OleVariant;
sFileName: string;
Retvar: Boolean;
begin
sFileName := ChangeFileExt(AFileName, '.mht');
DeleteFile(PAnsiChar(sFileName));
try
oConfig := CreateOleObject('CDO.Configuration');
oMSG := CreateOleObject('CDO.Message');
oMSG.Configuration := oConfig;
oMSG.CreateMHTMLBody(AUrl);
oMSG.GetStream.SaveToFile(sFileName);
Retvar := True;
except
on E: Exception do
begin
if AShowErrorMessage then MessageDlg(E.Message, mtError, [mbOK], 0);
Retvar := False;
end;
end;
oMSG := VarNull;
oConfig := VarNull;
Result := Retvar;
end;
Delphi - .....................................
XP başlangıç menüsünün stilini değiştirmek
Standart ya da klasik görünüm
(***********************************************************************
** Who wants to know more about the method how I discovered all this
** may have a look at the following URL (German) or contact me via my
** forum:
**
** http://www.delphipraxis.net/topic62087,0,asc,0.html
***********************************************************************)
type
SHELLSTATE = record
Flags1: DWORD;
(*
BOOL fShowAllObjects : 1;
BOOL fShowExtensions : 1;
BOOL fNoConfirmRecycle : 1;
BOOL fShowSysFiles : 1;
BOOL fShowCompColor : 1;
BOOL fDoubleClickInWebView : 1;
BOOL fDesktopHTML : 1;
BOOL fWin95Classic : 1;
BOOL fDontPrettyPath : 1;
BOOL fShowAttribCol : 1; // No longer used, dead bit
BOOL fMapNetDrvBtn : 1;
BOOL fShowInfoTip : 1;
BOOL fHideIcons : 1;
BOOL fWebView : 1;
BOOL fFilter : 1;
BOOL fShowSuperHidden : 1;
BOOL fNoNetCrawling : 1;
*)
dwWin95Unused: DWORD; // Win95 only - no longer supported pszHiddenFileExts
uWin95Unused: UINT; // Win95 only - no longer supported cbHiddenFileExts
// Note: Not a typo! This is a persisted structure so we cannot use LPARAM
lParamSort: Integer;
iSortDirection: Integer;
version: UINT;
// new for win2k. need notUsed var to calc the right size of ie4 struct
// FIELD_OFFSET does not work on bit fields
uNotUsed: UINT; // feel free to rename and use
Flags2: DWORD;
(*
BOOL fSepProcess: 1;
// new for Whistler.
BOOL fStartPanelOn: 1; //Indicates if the Whistler StartPanel mode is ON or OFF.
BOOL fShowStartPage: 1; //Indicates if the Whistler StartPage on desktop is ON or OFF.
UINT fSpareFlags : 13;
*)
end;
LPSHELLSTATE = ^SHELLSTATE;
const
SSF_SHOWALLOBJECTS = $00000001;
SSF_SHOWEXTENSIONS = $00000002;
SSF_HIDDENFILEEXTS = $00000004;
SSF_SERVERADMINUI = $00000004;
SSF_SHOWCOMPCOLOR = $00000008;
SSF_SORTCOLUMNS = $00000010;
SSF_SHOWSYSFILES = $00000020;
SSF_DOUBLECLICKINWEBVIEW = $00000080;
SSF_SHOWATTRIBCOL = $00000100;
SSF_DESKTOPHTML = $00000200;
SSF_WIN95CLASSIC = $00000400;
SSF_DONTPRETTYPATH = $00000800;
SSF_SHOWINFOTIP = $00002000;
SSF_MAPNETDRVBUTTON = $00001000;
SSF_NOCONFIRMRECYCLE = $00008000;
SSF_HIDEICONS = $00004000;
SSF_FILTER = $00010000;
SSF_WEBVIEW = $00020000;
SSF_SHOWSUPERHIDDEN = $00040000;
SSF_SEPPROCESS = $00080000;
SSF_NONETCRAWLING = $00100000;
SSF_STARTPANELON = $00200000;
SSF_SHOWSTARTPAGE = $00400000;
procedure SHGetSetSettings(var lpss: SHELLSTATE; dwMask: DWORD; bSet: BOOL) stdcall;
external 'shell32.dll';
procedure SwitchStartpanelXP(xpstyle: Boolean);
var
lpss: SHELLSTATE;
bIsXPstyle: Boolean;
begin
ZeroMemory(@lpss, SizeOf(lpss));
// Retrieve current style
SHGetSetSettings(lpss, SSF_STARTPANELON, False);
// Check the current style
bIsXPstyle := (lpss.Flags2 and 2) = 2; // fStartPanelOn
// If a change occurred
if (bIsXPstyle <> xpstyle) then
begin
// If the user wants XP style then set it, else reset it
if (xpstyle) then
lpss.Flags2 := 2 // fStartPanelOn = 1
else
lpss.Flags2 := 0; // fStartPanelOn = 0
// Set new style
SHGetSetSettings(lpss, SSF_STARTPANELON, True);
// Notify desktop of the change
PostMessage(FindWindow('Progman', nil), WM_USER + $60, 0, 0);
end;
// Notify taskbar
PostMessage(FindWindow('Shell_TrayWnd', nil), WM_USER + $0D, 0, 0);
end;
Delphi - .....................................
XP başlangıç menüsünün stilini değiştirmek
Standart ya da klasik görünüm
(***********************************************************************
** Who wants to know more about the method how I discovered all this
** may have a look at the following URL (German) or contact me via my
** forum:
**
** http://www.delphipraxis.net/topic62087,0,asc,0.html
***********************************************************************)
type
SHELLSTATE = record
Flags1: DWORD;
(*
BOOL fShowAllObjects : 1;
BOOL fShowExtensions : 1;
BOOL fNoConfirmRecycle : 1;
BOOL fShowSysFiles : 1;
BOOL fShowCompColor : 1;
BOOL fDoubleClickInWebView : 1;
BOOL fDesktopHTML : 1;
BOOL fWin95Classic : 1;
BOOL fDontPrettyPath : 1;
BOOL fShowAttribCol : 1; // No longer used, dead bit
BOOL fMapNetDrvBtn : 1;
BOOL fShowInfoTip : 1;
BOOL fHideIcons : 1;
BOOL fWebView : 1;
BOOL fFilter : 1;
BOOL fShowSuperHidden : 1;
BOOL fNoNetCrawling : 1;
*)
dwWin95Unused: DWORD; // Win95 only - no longer supported pszHiddenFileExts
uWin95Unused: UINT; // Win95 only - no longer supported cbHiddenFileExts
// Note: Not a typo! This is a persisted structure so we cannot use LPARAM
lParamSort: Integer;
iSortDirection: Integer;
version: UINT;
// new for win2k. need notUsed var to calc the right size of ie4 struct
// FIELD_OFFSET does not work on bit fields
uNotUsed: UINT; // feel free to rename and use
Flags2: DWORD;
(*
BOOL fSepProcess: 1;
// new for Whistler.
BOOL fStartPanelOn: 1; //Indicates if the Whistler StartPanel mode is ON or OFF.
BOOL fShowStartPage: 1; //Indicates if the Whistler StartPage on desktop is ON or OFF.
UINT fSpareFlags : 13;
*)
end;
LPSHELLSTATE = ^SHELLSTATE;
const
SSF_SHOWALLOBJECTS = $00000001;
SSF_SHOWEXTENSIONS = $00000002;
SSF_HIDDENFILEEXTS = $00000004;
SSF_SERVERADMINUI = $00000004;
SSF_SHOWCOMPCOLOR = $00000008;
SSF_SORTCOLUMNS = $00000010;
SSF_SHOWSYSFILES = $00000020;
SSF_DOUBLECLICKINWEBVIEW = $00000080;
SSF_SHOWATTRIBCOL = $00000100;
SSF_DESKTOPHTML = $00000200;
SSF_WIN95CLASSIC = $00000400;
SSF_DONTPRETTYPATH = $00000800;
SSF_SHOWINFOTIP = $00002000;
SSF_MAPNETDRVBUTTON = $00001000;
SSF_NOCONFIRMRECYCLE = $00008000;
SSF_HIDEICONS = $00004000;
SSF_FILTER = $00010000;
SSF_WEBVIEW = $00020000;
SSF_SHOWSUPERHIDDEN = $00040000;
SSF_SEPPROCESS = $00080000;
SSF_NONETCRAWLING = $00100000;
SSF_STARTPANELON = $00200000;
SSF_SHOWSTARTPAGE = $00400000;
procedure SHGetSetSettings(var lpss: SHELLSTATE; dwMask: DWORD; bSet: BOOL) stdcall;
external 'shell32.dll';
procedure SwitchStartpanelXP(xpstyle: Boolean);
var
lpss: SHELLSTATE;
bIsXPstyle: Boolean;
begin
ZeroMemory(@lpss, SizeOf(lpss));
// Retrieve current style
SHGetSetSettings(lpss, SSF_STARTPANELON, False);
// Check the current style
bIsXPstyle := (lpss.Flags2 and 2) = 2; // fStartPanelOn
// If a change occurred
if (bIsXPstyle <> xpstyle) then
begin
// If the user wants XP style then set it, else reset it
if (xpstyle) then
lpss.Flags2 := 2 // fStartPanelOn = 1
else
lpss.Flags2 := 0; // fStartPanelOn = 0
// Set new style
SHGetSetSettings(lpss, SSF_STARTPANELON, True);
// Notify desktop of the change
PostMessage(FindWindow('Progman', nil), WM_USER + $60, 0, 0);
end;
// Notify taskbar
PostMessage(FindWindow('Shell_TrayWnd', nil), WM_USER + $0D, 0, 0);
end;
Delphi - .....................................
local/remote/active directory güvenlik ilkelerini değiştirmek
{
For win2k, xp or higher
}
uses ComObj, ActiveX, Registry;
const
GPO_OPEN_LOAD_REGISTRY = $00000001; // Load the registry files
{$EXTERNALSYM GPO_OPEN_LOAD_REGISTRY}
GPO_OPEN_READ_ONLY = $00000002; // Open the GPO as read only
GPO_SECTION_ROOT = 0; // Root
{$EXTERNALSYM GPO_SECTION_ROOT}
GPO_SECTION_USER = 1; // User
{$EXTERNALSYM GPO_SECTION_USER}
GPO_SECTION_MACHINE = 2; // Machine
const
IID_GPO: TGUID = '{EA502722-A23D-11d1-A7D3-0000F87571E3}';
type
HPROPSHEETPAGE = Pointer;
{$EXTERNALSYM HPROPSHEETPAGE}
PHPROPSHEETPAGE = ^HPROPSHEETPAGE;
LPOLESTR = POleStr;
_GROUP_POLICY_OBJECT_TYPE = (GPOTypeLocal,
// GPO on the local machine
GPOTypeRemote, // GPO on a remote machine
GPOTypeDS); // GPO in the Active Directory
{$EXTERNALSYM _GROUP_POLICY_OBJECT_TYPE}
GROUP_POLICY_OBJECT_TYPE = _GROUP_POLICY_OBJECT_TYPE;
IGroupPolicyObject = interface(IUnknown)
['{EA502723-A23D-11d1-A7D3-0000F87571E3}']
function New(pszDomainName, pszDisplayName: LPOLESTR; dwFlags: DWORD): HRESULT;
stdcall;
function OpenDSGPO(pszPath: LPOLESTR; dwFlags: DWORD): HRESULT; stdcall;
function OpenLocalMachineGPO(dwFlags: DWORD): HRESULT; stdcall;
function OpenRemoteMachineGPO(pszComputerName: LPOLESTR; dwFlags: DWORD): HRESULT;
stdcall;
function Save(bMachine, bAdd: BOOL; const pGuidExtension, pGuid: TGUID): HRESULT;
stdcall;
function Delete: HRESULT; stdcall;
function GetName(pszName: LPOLESTR; cchMaxLength: Integer): HRESULT; stdcall;
function GetDisplayName(pszName: LPOLESTR; cchMaxLength: Integer): HRESULT; stdcall;
function SetDisplayName(pszName: LPOLESTR): HRESULT; stdcall;
function GetPath(pszPath: LPOLESTR; cchMaxPath: Integer): HRESULT; stdcall;
function GetDSPath(dwSection: DWORD; pszPath: LPOLESTR; cchMaxPath: Integer): HRESULT;
stdcall;
function GetFileSysPath(dwSection: DWORD; pszPath: LPOLESTR;
cchMaxPath: Integer): HRESULT; stdcall;
//
// Returns a registry key handle for the requested section. The returned
// key is the root of the registry, not the Policies subkey. To set / read
// a value in the Policies subkey, you will need to call RegOpenKeyEx to
// open SoftwarePolicies subkey first.
//
// The handle has been opened with ALL ACCESS rights. Call RegCloseKey
// on the handle when finished.
//
// If the GPO was loaded / created without the registry being loaded
// this method will return E_FAIL.
//
// dwSection is either GPO_SECTION_USER or GPO_SECTION_MACHINE
// hKey contains the registry key on return
//
function GetRegistryKey(dwSection: DWORD; var hKey: HKEY): HRESULT; stdcall;
function GetOptions(var dwOptions: DWORD): HRESULT; stdcall;
function SetOptions(dwOptions, dwMask: DWORD): HRESULT; stdcall;
function GetType(var gpoType: GROUP_POLICY_OBJECT_TYPE): HRESULT; stdcall;
function GetMachineName(pszName: LPOLESTR; cchMaxLength: Integer): HRESULT; stdcall;
function GetPropertySheetPages(var hPages: PHPROPSHEETPAGE;
var uPageCount: UINT): HRESULT; stdcall;
end;
const
REGISTRY_EXTENSION_GUID: TGUID = (D1: $35378EAC; D2: $683F; D3: $11D2;
D4: ($A8, $9A, $00, $C0, $4F, $BB, $CF, $A2));
CLSID_GPESnapIn: TGUID = (D1: $8fc0b734; D2: $a0e1; D3: $11d1;
D4: ($a7, $d3, $0, $0, $f8, $75, $71, $e3));
procedure TForm1.Button1Click(Sender: TObject);
var
GPO: IGroupPolicyObject;
Key: HKEY;
begin
GPO := CreateComObject(IID_GPO) as IGroupPolicyObject;
if GPO.OpenLocalMachineGPO(GPO_OPEN_LOAD_REGISTRY) = S_OK then
begin
if GPO.GetRegistryKey(GPO_SECTION_USER, Key) = S_OK then
with TRegistry.Create do
try
RootKey := HKEY_CURRENT_USER;
if OpenKey('SoftwareMicrosoftWindowsCurrentVersionPoliciesExplorer', True) then
begin
WriteInteger('StartMenuLogOff', 0);
end;
RootKey := Key;
if OpenKey('SoftwareMicrosoftWindowsCurrentVersionPoliciesExplorer', True) then
begin
WriteInteger('StartMenuLogOff', 0);
end;
RegCloseKey(Key);
GPO.Save(False, True, REGISTRY_EXTENSION_GUID, CLSID_GPESnapIn);
finally
Free;
end;
SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, Integer(PChar('Polices')), 0);
end;
end;
Delphi - .....................................
local/remote/active directory güvenlik ilkelerini değiştirmek
{
For win2k, xp or higher
}
uses ComObj, ActiveX, Registry;
const
GPO_OPEN_LOAD_REGISTRY = $00000001; // Load the registry files
{$EXTERNALSYM GPO_OPEN_LOAD_REGISTRY}
GPO_OPEN_READ_ONLY = $00000002; // Open the GPO as read only
GPO_SECTION_ROOT = 0; // Root
{$EXTERNALSYM GPO_SECTION_ROOT}
GPO_SECTION_USER = 1; // User
{$EXTERNALSYM GPO_SECTION_USER}
GPO_SECTION_MACHINE = 2; // Machine
const
IID_GPO: TGUID = '{EA502722-A23D-11d1-A7D3-0000F87571E3}';
type
HPROPSHEETPAGE = Pointer;
{$EXTERNALSYM HPROPSHEETPAGE}
PHPROPSHEETPAGE = ^HPROPSHEETPAGE;
LPOLESTR = POleStr;
_GROUP_POLICY_OBJECT_TYPE = (GPOTypeLocal,
// GPO on the local machine
GPOTypeRemote, // GPO on a remote machine
GPOTypeDS); // GPO in the Active Directory
{$EXTERNALSYM _GROUP_POLICY_OBJECT_TYPE}
GROUP_POLICY_OBJECT_TYPE = _GROUP_POLICY_OBJECT_TYPE;
IGroupPolicyObject = interface(IUnknown)
['{EA502723-A23D-11d1-A7D3-0000F87571E3}']
function New(pszDomainName, pszDisplayName: LPOLESTR; dwFlags: DWORD): HRESULT;
stdcall;
function OpenDSGPO(pszPath: LPOLESTR; dwFlags: DWORD): HRESULT; stdcall;
function OpenLocalMachineGPO(dwFlags: DWORD): HRESULT; stdcall;
function OpenRemoteMachineGPO(pszComputerName: LPOLESTR; dwFlags: DWORD): HRESULT;
stdcall;
function Save(bMachine, bAdd: BOOL; const pGuidExtension, pGuid: TGUID): HRESULT;
stdcall;
function Delete: HRESULT; stdcall;
function GetName(pszName: LPOLESTR; cchMaxLength: Integer): HRESULT; stdcall;
function GetDisplayName(pszName: LPOLESTR; cchMaxLength: Integer): HRESULT; stdcall;
function SetDisplayName(pszName: LPOLESTR): HRESULT; stdcall;
function GetPath(pszPath: LPOLESTR; cchMaxPath: Integer): HRESULT; stdcall;
function GetDSPath(dwSection: DWORD; pszPath: LPOLESTR; cchMaxPath: Integer): HRESULT;
stdcall;
function GetFileSysPath(dwSection: DWORD; pszPath: LPOLESTR;
cchMaxPath: Integer): HRESULT; stdcall;
//
// Returns a registry key handle for the requested section. The returned
// key is the root of the registry, not the Policies subkey. To set / read
// a value in the Policies subkey, you will need to call RegOpenKeyEx to
// open SoftwarePolicies subkey first.
//
// The handle has been opened with ALL ACCESS rights. Call RegCloseKey
// on the handle when finished.
//
// If the GPO was loaded / created without the registry being loaded
// this method will return E_FAIL.
//
// dwSection is either GPO_SECTION_USER or GPO_SECTION_MACHINE
// hKey contains the registry key on return
//
function GetRegistryKey(dwSection: DWORD; var hKey: HKEY): HRESULT; stdcall;
function GetOptions(var dwOptions: DWORD): HRESULT; stdcall;
function SetOptions(dwOptions, dwMask: DWORD): HRESULT; stdcall;
function GetType(var gpoType: GROUP_POLICY_OBJECT_TYPE): HRESULT; stdcall;
function GetMachineName(pszName: LPOLESTR; cchMaxLength: Integer): HRESULT; stdcall;
function GetPropertySheetPages(var hPages: PHPROPSHEETPAGE;
var uPageCount: UINT): HRESULT; stdcall;
end;
const
REGISTRY_EXTENSION_GUID: TGUID = (D1: $35378EAC; D2: $683F; D3: $11D2;
D4: ($A8, $9A, $00, $C0, $4F, $BB, $CF, $A2));
CLSID_GPESnapIn: TGUID = (D1: $8fc0b734; D2: $a0e1; D3: $11d1;
D4: ($a7, $d3, $0, $0, $f8, $75, $71, $e3));
procedure TForm1.Button1Click(Sender: TObject);
var
GPO: IGroupPolicyObject;
Key: HKEY;
begin
GPO := CreateComObject(IID_GPO) as IGroupPolicyObject;
if GPO.OpenLocalMachineGPO(GPO_OPEN_LOAD_REGISTRY) = S_OK then
begin
if GPO.GetRegistryKey(GPO_SECTION_USER, Key) = S_OK then
with TRegistry.Create do
try
RootKey := HKEY_CURRENT_USER;
if OpenKey('SoftwareMicrosoftWindowsCurrentVersionPoliciesExplorer', True) then
begin
WriteInteger('StartMenuLogOff', 0);
end;
RootKey := Key;
if OpenKey('SoftwareMicrosoftWindowsCurrentVersionPoliciesExplorer', True) then
begin
WriteInteger('StartMenuLogOff', 0);
end;
RegCloseKey(Key);
GPO.Save(False, True, REGISTRY_EXTENSION_GUID, CLSID_GPESnapIn);
finally
Free;
end;
SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, Integer(PChar('Polices')), 0);
end;
end;
Delphi - .....................................
Tabiki Mümkün amaaaa
EXE den kod çıkarmak tabiki mümkün ama bu sorunun yeri burası değil
diğer arkadaşlar burda bağırıyor soru sormayın diye lütfen dikkat edelim
Delphi Decompiler (De-De) isimli bir program mevcut piyasada.....
tabiki anlayabildiği kodu çevirebiliyor :)
anlayamadığı kısımları assebmly kodlarında görüntülüyor....
Corsair
Delphi - .....................................
Tabiki Mümkün amaaaa
EXE den kod çıkarmak tabiki mümkün ama bu sorunun yeri burası değil
diğer arkadaşlar burda bağırıyor soru sormayın diye lütfen dikkat edelim
Delphi Decompiler (De-De) isimli bir program mevcut piyasada.....
tabiki anlayabildiği kodu çevirebiliyor :)
anlayamadığı kısımları assebmly kodlarında görüntülüyor....
Corsair
Delphi - .....................................
kod çıkarma
slm arkadaşlar exe içinden kod çıkarmak mümkünmü
bir fikri olanların maillereni bekliyorum
Mehmet Kocabas
e-mail: mehmetkocabas2@hotmail.com
Delphi - .....................................
kod çıkarma
slm arkadaşlar exe içinden kod çıkarmak mümkünmü
bir fikri olanların maillereni bekliyorum
Mehmet Kocabas
e-mail: mehmetkocabas2@hotmail.com
Delphi - .....................................
Delphi7 ve Iny ile SMS
//murat turan
//http://www.datakent.com
TIdHTTP bileşeni forma ekleyin
var
veri:TStrings;
sonuc:TStringStream;
XmlString:string;
begin
XmlString:=
' <MainReportRoot> ' +
' <UserName>demo905367737871-3501</UserName> ' +
' <PassWord>3itbok</PassWord> ' +
' <Action>4</Action> ' +
' </MainReportRoot> ';
veri := TStringList.Create;
veri.Add( XmlString );
sonuc := TStringStream.Create('');
try
IdHTTP1.Post('http://app.cmfcell.com/httppost/requestxml.aspx',veri,sonuc);
Memo1.Text := sonuc.DataString;
finally
sonuc.Free;
veri.Free;
end;
//tek sms göndermek için XML
<MainmsgBody>
<UserName>test-3501</UserName>
<PassWord>test</PassWord>
<Action>0</Action>
<Mesgbody>CMFCell Örnek Mesaj</Mesgbody>
<Numbers>905332669297</Numbers>
<Originator>Cmfcell.com</Originator>
<SDate></SDate>
</MainmsgBody>
//Çoklu SMS için XML
<MainmsgBody>
<UserName>username-CID</UserName>
<PassWord>password</PassWord>
<Action>1</Action>
<Messages>
<Message>
<Mesgbody>your message1</Mesgbody>
<Number>905321234567</Number>
</Message>
<Message>
<Mesgbody>your message2</Mesgbody>
<Number>905421234567</Number>
</Message>
</Messages>
<Originator>Cmfcell.com</Originator>
<SDate></SDate>
</MainmsgBody>
*/
Delphi - .....................................
Delphi7 ve Iny ile SMS
//murat turan
//http://www.datakent.com
TIdHTTP bileşeni forma ekleyin
var
veri:TStrings;
sonuc:TStringStream;
XmlString:string;
begin
XmlString:=
' <MainReportRoot> ' +
' <UserName>demo905367737871-3501</UserName> ' +
' <PassWord>3itbok</PassWord> ' +
' <Action>4</Action> ' +
' </MainReportRoot> ';
veri := TStringList.Create;
veri.Add( XmlString );
sonuc := TStringStream.Create('');
try
IdHTTP1.Post('http://app.cmfcell.com/httppost/requestxml.aspx',veri,sonuc);
Memo1.Text := sonuc.DataString;
finally
sonuc.Free;
veri.Free;
end;
//tek sms göndermek için XML
<MainmsgBody>
<UserName>test-3501</UserName>
<PassWord>test</PassWord>
<Action>0</Action>
<Mesgbody>CMFCell Örnek Mesaj</Mesgbody>
<Numbers>905332669297</Numbers>
<Originator>Cmfcell.com</Originator>
<SDate></SDate>
</MainmsgBody>
//Çoklu SMS için XML
<MainmsgBody>
<UserName>username-CID</UserName>
<PassWord>password</PassWord>
<Action>1</Action>
<Messages>
<Message>
<Mesgbody>your message1</Mesgbody>
<Number>905321234567</Number>
</Message>
<Message>
<Mesgbody>your message2</Mesgbody>
<Number>905421234567</Number>
</Message>
</Messages>
<Originator>Cmfcell.com</Originator>
<SDate></SDate>
</MainmsgBody>
*/
Delphi - .....................................
neoturk - re: "ağ üzerinden veya internetten ip adresine göre dosya alma ve gönderme"
herkese merhaba,
nmstrm komponentleri hakkında dosya gönderme örneği
göndermiş bir arkadaşımız. sağ olsun var olsun, da,
xp işletim sistemi kuşağında yaşıyoruz...
bu dosya gönderme komponentleri çalışmıyor xp de...
not: bu konu hakkında 2 ocak 2004 tarihli raporumu aktarıyorum müsadenizle
(nostaljilerden esintiler..)
"
Written by neoturk - 02.01.2004
Konu: TCP/IP protokolu üzerinden dosya transferi
Merhaba ortak… Birkaç haftadır kafamı meşgul eden dosya transferinin nasıl
olacağı konusunda epey bir teorik düşünce sarfettim..
kendi yazdığım mini bir programda tcp/ip üzerinden dosya transferini yaptım.
Local olarak %100 olarak çalışıyor, ama kafamda hala cevaplanmamış
sorular var, biraz da ben abartıyorum, çünkü tekli dosya transferinden
ziyade multi-transfer olayının olmasını istiyorum.
Bunun yanı sıra multi-transfer olurken multi-connect
işlemini de desteklemesini istiyorum. Teoride biraz zor görünüyor,
pratikte biraz uğraştırır. Kafayı takarsam yaparım diyorum ama şu an
için gereği yok.. zaten böyle bir şeyi yaptığımda
kazaa türü program yapmış oluyoruz..
Herneyse, kodu ben de incelemek istiyorum.
Yerine oturtmam gereken kodlama ve düşünsel mantıklarım var.
Ne zamandır analizleyememiştim şimdi başlıyoruz….
Basit bir client arabirim ve basit bir server arabirim
programı yazmıştım, içinden kritik kodları çektim ve tek tek analiz etmek istedim.
Böylece senin de fikirlerini almış olurum, daha iyi irdelemiş oluruz..
Öncelikle vurgulamak istediğim çok önemli analizler var:
1. Internet programcılığı ile uğraşıyor isek
( bu trojan veya her neyse fark etmez ) kesinlikle ve kesinlikle DOSYA TRANSFERİ
olayının %100 sorunsuz olarak çözülmesi gerekiyor.
Çünkü bağlantı sağlanmasında bir problem yok,
ancak er ya da geç dosya transfer olayına ihtiyaç duyulacak!
Bunun için bu konunun bizzat çözümlenmesi ve kendi mantığımıza göre
işleme geçmesi gerekiyor.
2. Delphi olsun CBuilder olsun,
bu programlama dillerinde dosya transfer işini gören NMSTRM
adlı komponent (paket) serisi var.
Hemen hemen tüm programcılar bu komponentleri kullanırlar.
( Çok önemli dip not: Okuduğum birçok delphi kitabında
(okumadığımı yok denecek kadar parmakla gösterebilirim)
dosya transfer örneklerini nedense hep nmstrm komponentleri
üzerinde anlatırlar. Oradaki örneklerde dosya transferleri çalışır.
Oturur yazarsın ve her şeyin çalıştığını görünce bir şeyler öğrendiğini sanırsın..
doğrudur.. ama Level2'ye geçtiğinde NMSTRM komponentlerinin yetersiz
olduğunu ben dahil deneyimli coderler er geç fark etmişlerdir…
Bu nedenle oturup adam gibi kodunu kendin yazmalısın..
( icq gibi, paltalk gibi.. )
3. Örnek trojanlar incelendiğinde nedense çoğunda
dosya transfer olayının nasıl yapıldığı gösterilmemiştir.
Bunu gösteren tek örnek trojan kodu LATINUS trojanıdır.
( tek tük bazı trojanlarda da mevcut ancak tarihi eser kalıntılarıyla dolu
ve çalışmayan kod parçacıklarıdır )
4. Latinus trojanındaki dosya transfer işlemi Multi-File
yöntemini destekleyen şekilde transfere müsaade ediyor,
ama kullanımı pek etkin değil.. denedim kullandım çalıştırdım ama etkin değil..
hangi dosyanın ne zaman vardığı, nereye gittiği Allah kerim..
gidiyor dosyalar ve direkt temp klasörüne kopyası çıkartılıyor..
kodu yazan adam biraz kulağını SAĞ'dan göstermiş..
welhasıl pek verimli bir kod değil…
5. Dosya göndermek gerçekten önemli bir konu, nedenine gelince,
coderlerin %99'u ( abartmıyorum ) nmstrm komponentini kullanırlar
ve kullanacaklardır. Oturup sıfırdan kodunu yazması inan kasıyor…
işin komik yanı da network içinden dışarıya bağlantı yapıldığında
nmstrm componentleri dosya transferlerini yapamıyor..
bunu ya bilerek es geçtiler ya da unuttular..
çünkü bizim daha önceki yazdığımız tüm versiyonlarda nmstrm
komponentlerini kullanmıştım. O yüzden network-dialup arasındaki dosya
transferleri olmuyordu. ( network içinden evdeki pcye bağlantı örneğinde olduğu gibi )
( ama msn veya icq bunu gayet güzel yapıyor değil mi ? )
6. Çok ince bir nuans daha var, tcp/ip ( socketler )
üzerinden dosya göndereceğimiz zaman 2 seçeneğimiz var.
Block ve None-Block seçimi… block işlemli socketlerde bir sonraki gelen veri
paketi cache socket belleğinde tutulur. Aktif olan veri dosyaya
yazıldıktan sonra cache socket belleğinden alır ve
böylece işlemler devam eder.. ( winsock topolojisi ).
none-block seçimi yaparsak cache bellekte veri tutulmaz.
Gelen veri direkt işlenir. İşlenen bir veri sırasında şayet
ikinci bir veri paketi gelirse bu paket boşa gide çünkü cache
bellekte tutulmaz… burada şöyle bir sorun var, winsock cache bellek dolar elbet…
bu durumda da aynen 3ün 1ini alırız… bu sorunun düzeltilmesi
konusundaki bazı profesyonel yaklaşımları birkaç programda görmüştüm..
bunlardan en etkini de bildiğimiz icq ve msn dosya transferleri…
7. Benim amacım cache belleğin dolmasına müsaade etmeden ping-pong
( paketi aldım-sonrakini gönder) mantığına göre veri paketlerini sırayla göndermek.
( icqdaki file send speed olayı, 1-5 arası hız seçimi vardı hatırlarsan.. olayın özü burada yani… )
etc ...
"
son not:
azmin sonu başarıdır !
yıl 2006, şirketler arası file-sharing/multy_file_sent/multy-chat programları ile bu
konuya son noktayı koydum.
hepinize iyi günler iyi çalışmalar, hayırlı işler diliyorum
"Türk Coderler Her Zaman Zeki ve Güçlüdür"
saygılarımla_ [ xxnt03@lycos.co.uk ]
Delphi - .....................................