|
Тема
|
какво не му е наред !! помогнете
|
|
Автор |
Nova_tt (непознат
) |
Публикувано | 07.06.06 12:52 |
|
моля помогнете , това е един прост DLL и не мога да го компилрам .
с Делфи 7 съм. не знам дали това е бедата. трябва ми просто една функция ка качва файл на FTP . ако може някой да помогне с друга идея ще съм много благодарен .
ето кода :
// IdBaseComponent, IdComponent,
// IdTCPConnection, IdTCPClient, IdFTP;
Function PutFileToFTP(filename:string;host_url:string;Login:string ,Password_:string;wwwfile:string):boolean;
var IdFTP_x: TIdFTP;
er:Tfilestream;
begin
try
IdFTP_x:=TIdFTP.Create(nil);
with IdFTP_x do begin
Password:=Password_;
User:=Login;
Host:=host_url;
SocksInfo.Password:=Password_;
SocksInfo.UserID:=Login;
SocksInfo.Port:=21; // ïîðò
SocksInfo.Host:=host_url;
Connect(true);
if Connected then begin
if fileage(filename)<>-1 then begin
try
er:=Tfilestream.Create(filename,fmOpenRead);
Put(er,wwwfile);
finally
er.Free;
end;
end;
end;
end;
finally
IdFTP_x.Free;
end;
end;
| |
Тема
|
Re: какво не му е наред !! помогнете
[re: Nova_tt]
|
|
Автор |
Dim_cR (непознат) |
Публикувано | 07.06.06 13:23 |
|
Мисля, че за качването на файл не е нужно да се товари програмата с Indy. Достатъчно функции предлага и wininet:
uses ....., wininet;
Function PutFileToFTP(filename:string;host_url:string;Login:string ,Password_:string;wwwfile:string):boolean;
var intconn,intopen : hinternet;
begin
intopen := internetopen(PChar(Application.Title),INTERNET_OPEN_TYPE_DIRECT,nil,nil,0);
intconn := internetconnect(intopen,pchar(host_url),21,pchar(Login),pchar(Password_),INTERNET_SERVICE_FTP,INTERNET_FLAG_PASSIVE,0);
ftpputfile(intconn,pchar(filename),pchar(wwwfile),FTP_TRANSFER_TYPE_UNKNOWN,0);
if getlasterror() = 0 then begin //check if ftp server worked (ftp is online)
internetclosehandle(intopen);
Result:=True;
end;
end;
| |
|
Само да ви обърна внимание върху едно нещо - когато предавате към/от dll дълги стрингове (под дълги разбирай тип string, а не че имат много символи вътре), динамични масиви, обекти, които създават такива неща и т.н. трябва да включите юнита ShareMem на първо място в uses клаузата на dll-а и на проекта. Отбелезвам го, понеже примерите и на двама ви са с параметри от тип string. Или най-добре използвайте параметри тип ShortString или PChar, като паметта за PChar-а трябва да си я резервираш и освобождаваш в приложението.
В хелпа тия въпроси са доста добре обяснени.
| |
|
Izpolzvah definiciqta na Nova_TT. V moq primer e po-dobre oshte v deklaraciqta vsichko da e PChar(ide rech vse pak za WinAPI).
Редактирано от Dim_cR на 07.06.06 13:49.
| |
Тема
|
Re: Използване на string в dll
[re: Dim_cR]
|
|
Автор |
Nova_tt (непознат
) |
Публикувано | 07.06.06 15:11 |
|
Благодаря много и на двамата. Сега пробвам примера който ми предложи, компилира се нормално ( моя само грешки :( ) , но забива като извикам функцията, сега или ще сменя "string" с "pchar" или ще пробвам с ShareMem
| |
Тема
|
Re: Използване на string в dll
[re: andrew_nikoloff]
|
|
Автор | Любoзнaтeлko (Нерегистриран) |
Публикувано | 07.06.06 16:01 |
|
А това важи ли също и за стрингове, когато те се използват само вътре в DLL, например в тялото на функция и/или се предават между функции, обекти, дефинирани вътре в DLL-а?!? Няма експорт извън модула.
| |
|
В хелпа се казва следното:
If a DLL exports routines that pass long strings or dynamic arrays as parameters or function results (whether directly or nested in records or objects), then the DLL and its client applications (or DLLs) must all use the ShareMem unit. The same is true if one application or DLL allocates memory with New or GetMem which is deallocated by a call to Dispose or FreeMem in another module. ShareMem should always be the first unit listed in any program or library uses clause where it occurs.
ShareMem is the interface unit for the BORLANDMM.DLL memory manager, which allows modules to share dynamically allocated memory. BORLANDMM.DLL must be deployed with applications and DLLs that use ShareMem. When an application or DLL uses ShareMem, its memory manager is replaced by the memory manager in BORLANDMM.DLL.
Или отговорът на твоя въпрос е - не, в такъв случай не е нужно
Простичко казано въпросът е в това, че паметта, заделена за един динамичен обект от приложението може да бъде освободена, въпреки че тя се ползва в DLL-а. Това е по простата причина, че мемори мениджъра няма как да знае за референцията, която е в DLL-а. Обратното също е вярно. Именно това е ролята на Borland Memory Manager-а (BorlandMM.DLL) - да обедини управлението на паметта в двата (или повече) модули.
| |
Тема
|
Re: Използване на string в dll
[re: andrew_nikoloff]
|
|
Автор | Любoзнaтeлko (Нерегистриран) |
Публикувано | 09.06.06 11:11 |
|
Благодаря много!
Мислих си аз такива неща, но едно "рамо" да получа си е друго
Още веднъж - Tnx!
| |
Тема
|
Re: Използване на string в dll
[re: Любoзнaтeлko]
|
|
Автор | Daniel (Нерегистриран) |
Публикувано | 11.06.06 15:49 |
|
А освен PChar, може да се подаде и widestring, върши същата работа (при викане на функции от DLL).
| |
|
|
|
|