Zrobilem bibloteke dll z formularzem na fromie mam tedit i chcialbym wyexportowac łancuch z edita do programu i umieścic go w labelu. Czytałem Faq i nadal nic mi nie wychodzi. Posze o pomoc!!!
a w jaki sposób próbowałeś go eksportować? shortstring?
Nie bardzo wiem jak to opisac. Czy moge prosic o napisanie kodu ktory exportuje z bibloteki i kodu ktory to wstawia do labala? Z góry dziekuje!!!
<ort>Wzielem </ort>i <ort>ściągnąłem </ort>sobie ten przykład i zrobilem tak samo i po uruchomieniu aplikacji Od razu wyskakuje taki komunikat ' Nie znaleziono punktu wejścia procedury katalog w biblotece system\kat.dll'. I nie wiem co jes? A zrobilem tak samo. Tylko zmienila sie nazwa kontrolki ale to jest poprawnie. Prosze o pomoc!!! Nie wiem jak juz to zrobic!!!
// o matko... słownik!!! - Ł
to może najpierw poczytaj trochę o DLLach, np. w artach na 4p
Czytałem arty. i mam zrobione w podobny sposob łancuch tekstu jest exportowany przez nazwe. Tylko Jest ten problem z tym komunikatem i nie wiem co moze byc nie tak? Prosze o pomoc!!!
coś słabo czytałeś. Oznacza to, że procedura o podanej nazwie nie jest wyexportowana. Daj kod dllki
Moze cos gdzies opuscilem?
O to kod:
library Kat_a;
{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }
uses
SysUtils,
Classes,
Forms,
Kat in 'Kat.pas' {Form1};
{$R *.res}
procedure otwarcie ; stdcall;
begin
form:= Tform1.Create(Application);
end;
function katalog(): TEdit;
begin
result:= Form1.E1;
end;
exports
otwarcie name 'otwarcie',
katalog name 'katalog';
begin
end.
- używaj < delphi> i < /delphi> dla kodu (z łaski swojej zastosuj to do poprzedniego swojego postu bo się łątwiej czyta)
- pokaż jeszcze jak w exeku importujesz te procedury
ok! Sorry za problem z postem.
end;
procedure otwarcie; stdcall;
external 'system\Kat_a.dll' name 'otwarcie';
function katalog: Tedit; stdcall; external 'system\Kat_a.dll' name 'katalaog';
var
Form1: TForm1;
procedure TForm1.Button2Click(Sender: TObject);
var
E : Tedit;
begin
otwarcie;
E:= katalog;
E2.Text:= E.Text;
end;
A jeszcze jedno czy moge z bibloteki dll wywolać inna bibloteke?
śmiem twierdzić, że w system\ (nie jest to oczywiście windows\system) masz złą wersję dllki - kod wygląda OK.
Taka mała uwaga, przeczytaj co masz napisane w <ort>komentażu </ort>w dllce
Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters.
Nie możesz przekazywać ot tak sobie klas między Dll i Exe. Przecież na dobrą sprawę potrzebujesz sam text z tego edita a nie całego edita. Zmień w dll
function katalog(): PChar;
begin
result:= PChar(Form1.E1.Text); //BTW Form1 masz oczywiście w dllce :>
end;
a w Exe
function katalog: PChar; stdcall; external 'system\Kat_a.dll' name 'katalaog';
Czy moge zaladowac bibloteke dll z innej bibloteki dll?
po poprawieniu kodu pod edytorem <ort>wyskakoja </ort>mi takie komunikaty:
[Warning] Kat_a.dpr(31): Unsafe type 'PChar'
[Warning] Kat_a.dpr(33): Unsafe type 'Result: PAnsiChar'
[Warning] Kat_a.dpr(33): Unsafe type 'PChar'
Czegos nie poprawiłem?
Dalej ten sam komunikat "Nie znaleziono punktu .....". Zmienilem tak jak napisales. Co moze byc jeszcze nie tak???
</b>
przeszukaj dysk pod kątem Kat_a.dll, usuń wszystkie, ort! ją jeszcze raz i zobacz. Dalej jestem za tym, że masz gdzieś złą wersje tej dllki
Można wywoływać dllkę z dllki
Wyszukalem i ort!, skompilowałem jeszcze raz. I nic nie dalo dale jest to samo.
[Warning] Kat_a.dpr(31): Unsafe type 'PChar'
[Warning] Kat_a.dpr(33): Unsafe type 'Result: PAnsiChar'
[Warning] Kat_a.dpr(33): Unsafe type 'PChar'
Po uruchomieniu prograamu i zaladowanie bibloteki kiedy chce przeniesc tekst z edita to wysskakuje mi taki komunikat:
Access violation at address 0F3357E in module 'Kata_a.dll'. Read of address 00000304.
Juz nie wiem co dalej zrobic? Moze jest jakis inny sposob?
Bibloteka ma dzialac na zasadzie: Kiedy naciskam butona otwiera sie forma z bibloteki po wpisaniu textu do edita i kliknieciu butona forma sie zamyka i zostaje przeniesiony text do labela w programie.
Jeszcze jedno czy ta sama procedura by obejmowala inna bibloteke dllke jak bym chcial z niej uruchomic dllke Kat_a.dll?
wyślij mi projekt exe i dll na misiekd(at)poczta(dot)fm
<ort>Powiec </ort>mi dlaczego dllka ma az 3,41 mb. Czemu az tyle? Na formie mam cos takiego jak TShellTreeView z zakladki samples, TEdita i 2 butony! Jesli chodzi o wyslanie bo upload mam tylko 64 kbit. I troche to potrwalo by!
A moze jest inny sposob?
Nie chodzi mi o skompilowango exeka i dllkę tylko o źródła. A co do rozmiaru to przez komponenty - po samym dodaniu forms do uses dllka puchnie o jakieś 500kB
Wyslalem!!!
A jak moge uruchomic z dll-ki inna dll-ke? Czy ta sama procedura co <ort>z pod</ort> pliku exec?
dostałem, oglądam. A gdzie exe?
BTW: wiesz takie rzeczy to się pakuje najpierw np. zipem albo rarem
Tak
Sorry. I Co jest nie tak? A jak moge uruchomic te sama procedure i dllke z innej dllki?
Exe:
var
Form1: TForm1;
implementation
{$R *.dfm}
function GetDir(var Dir: PChar; AHandle: THandle): TModalResult; stdcall;
external 'kat_a.dll' name 'GetDir';
procedure TForm1.Button1Click(Sender: TObject);
var
Dir: PChar;
begin
GetDir(Dir, Application.Handle);
L1.Caption := Dir;
end;
end.
dll:
library Kat_a;
uses
Kat in 'Kat.pas' {Form1};
{$R *.res}
exports
GetDir name 'GetDir';
begin
end.
unit Kat;
interface
uses
Classes, Controls, Forms, SysUtils,
StdCtrls, Buttons, ShellCtrls, ComCtrls;
type
TForm1 = class(TForm)
Sh: TShellTreeView;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
E1: TEdit;
procedure ShClick(Sender: TObject);
procedure ShDblClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
function GetDir(var Dir: PChar; AHandle: THandle): TModalResult; stdcall;
implementation
{$R *.dfm}
function GetDir(var Dir: PChar; AHandle: THandle): TModalResult;
var
f: TForm1;
begin
Application.Handle := AHandle;
f := TForm1.Create(Application);
try
Result := f.ShowModal;
if Result = mrOK then
Dir := PChar(f.E1.Text)
else
Dir := '';
finally
FreeAndNil(f);
end;
end;
procedure TForm1.ShClick(Sender: TObject);
begin
E1.Text:= Sh.Path;
end;
procedure TForm1.ShDblClick(Sender: TObject);
begin
ModalResult := mrOk;
end;
end.
Dodatkowo w OI dla jednego buttona ustaw ModalResult = mrCancel a dla drugiego mrOK
No i tak na samym końcu TShellTreeView jest lekko mówiąc "niedopracowany" i jeśli rozwinie się Mój komputer (co trwa zdecydowanie za długo) to potem nie pozwala zamknąć się programowi. Radzę zostawić go w spokoju i poszukać czegoś innego (np. standardowe okienko windowsa)
uses
ShlObj,
Windows;
function BrowseForFolder(BrowseTitle: PChar; InitialFolder: PChar; AHandle: HWND): PChar;
implementation
var
lg_StartFolder: String;
function BrowseForFolderCallBack(Wnd: HWND; uMsg: UINT; lParam, lpData: LPARAM): Integer stdcall;
begin
if uMsg = BFFM_INITIALIZED then
SendMessage(Wnd,BFFM_SETSELECTION,1,Integer(@lg_StartFolder[1]));
result := 0;
end;
function BrowseForFolder(BrowseTitle: PChar; InitialFolder: PChar; AHandle: HWND): PChar;
var
bi: TBrowseInfo;
Folder: array[0..MAX_PATH] of char;
FindContext: PItemIDList;
begin
FillChar(bi, SizeOf(bi), #0);
lg_StartFolder := InitialFolder;
bi.pszDisplayName := @Folder[0];
bi.lpszTitle := BrowseTitle;
bi.ulFlags := BIF_RETURNONLYFSDIRS;
bi.hwndOwner := AHandle;
if initialFolder <> '' then
bi.lpfn := BrowseForFolderCallBack;
FindContext := SHBrowseForFolder(bi);
if Assigned(FindContext) then
begin
if SHGetPathFromIDList(FindContext, Folder) then
result := Folder
else
result := '';
GlobalFreePtr(FindContext);
end
else
result := '';
end;
ort! mi ta część kodu ma zastąpić ShellTreeView?
uses
ShlObj,
Windows;
function BrowseForFolder(BrowseTitle: PChar; InitialFolder: PChar; AHandle: HWND): PChar;
implementation
var
lg_StartFolder: String;
function BrowseForFolderCallBack(Wnd: HWND; uMsg: UINT; lParam, lpData: LPARAM): Integer stdcall;
begin
if uMsg = BFFM_INITIALIZED then
SendMessage(Wnd,BFFM_SETSELECTION,1,Integer(@lg_StartFolder[1]));
result := 0;
end;
function BrowseForFolder(BrowseTitle: PChar; InitialFolder: PChar; AHandle: HWND): PChar;
var
bi: TBrowseInfo;
Folder: array[0..MAX_PATH] of char;
FindContext: PItemIDList;
begin
FillChar(bi, SizeOf(bi), #0);
lg_StartFolder := InitialFolder;
bi.pszDisplayName := @Folder[0];
bi.lpszTitle := BrowseTitle;
bi.ulFlags := BIF_RETURNONLYFSDIRS;
bi.hwndOwner := AHandle;
if initialFolder <> '' then
bi.lpfn := BrowseForFolderCallBack;
FindContext := SHBrowseForFolder(bi);
if Assigned(FindContext) then
begin
if SHGetPathFromIDList(FindContext, Folder) then
result := Folder
else
result := '';
GlobalFreePtr(FindContext);
end
else
result := '';
end;
Troche tn kod jest dla mnie skomplikowany! ort! mi jak go moge ort!? I co on dokladni robi?
tomek0001 napisał(a)
ort! mi ta część kodu ma zastąpić ShellTreeView?
to jest standardowe okienko wyboru folderu
Troche tn kod jest dla mnie skomplikowany! ort! mi jak go moge ort!? I co on dokladni robi?
dopisz na początku unit xxx; a na końcu end. i tyle, wywołuje się go tak
BrowseForFolder('Podaj katalog', 'C:', Application.Handle);
Wlasnie skompilowalem program i dziala nie wiesza programu jest ok! <ort>Sprubuje </ort>jeszcze z tym drubim kodem by zastapic shellTreeViewa.
Wielkie dzieki za pomoc! Zycze milego dnia!
tomek0001 napisał(a)
Wlasnie skompilowalem program i dziala nie wiesza programu jest ok! Sprubuje jeszcze z tym drubim kodem by zastapic shellTreeViewa.
Wielkie dzieki za pomoc! Zycze milego dnia!
uruchom program, odpal formę z dllki, rozwiń mój komputer potem zamknij formę z dllki (kliknij OK) zamknij program i zobacz czy Ci nie został w menadżerze zadań
// wow, że też Ci się chciało... ja bym się wcześniej ze dwa razy pociął i co najmniej raz wyskoczył z okna - Ł
Wlasnie sprawdzilem i nie zostaje znika po zamknieciu programu! Wszystko ok! Kompiluje sie bez problemow i tez bez problemu sie uruchamia i zamyka! Nic nie zostaje w Menadzerze zadan! Pozdrawiam!
Czy jest mozliwosc importowac łańcuch textu do bibloteki dll i w jaki sposob moge to zrobić? Z góry wielkie dziki!!!
wywołując funkcje ze stringiem jako parametrem ?
poczytaj 'delphi 6 vademecum profesjonalisty tom 1' strony 275-314.