Exportowanie łańcucha textu

0

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!!!

0

a w jaki sposób próbowałeś go eksportować? shortstring?

0

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!!!

0

<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!!! - Ł

0

to może najpierw poczytaj trochę o DLLach, np. w artach na 4p

0

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!!!

0

coś słabo czytałeś. Oznacza to, że procedura o podanej nazwie nie jest wyexportowana. Daj kod dllki

0

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.
0
  1. używaj < delphi> i < /delphi> dla kodu (z łaski swojej zastosuj to do poprzedniego swojego postu bo się łątwiej czyta)
  2. pokaż jeszcze jak w exeku importujesz te procedury
0

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?

0

ś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';
0

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?

0

Dalej ten sam komunikat "Nie znaleziono punktu .....". Zmienilem tak jak napisales. Co moze byc jeszcze nie tak???
</b>

0

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

0

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?

0

wyślij mi projekt exe i dll na misiekd(at)poczta(dot)fm

0

<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?

0

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

0

Wyslalem!!!

A jak moge uruchomic z dll-ki inna dll-ke? Czy ta sama procedura co <ort>z pod</ort> pliku exec?

0

dostałem, oglądam. A gdzie exe?
BTW: wiesz takie rzeczy to się pakuje najpierw np. zipem albo rarem

Tak

0

Sorry. I Co jest nie tak? A jak moge uruchomic te sama procedure i dllke z innej dllki?

0

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;
0

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?

0
tomek0001 napisał(a)

ort! mi ta część kodu ma zastąpić ShellTreeView?

to jest standardowe okienko wyboru folderu
user image

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);

0

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!

0
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 - Ł

0

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!

0

Czy jest mozliwosc importowac łańcuch textu do bibloteki dll i w jaki sposob moge to zrobić? Z góry wielkie dziki!!!

0

wywołując funkcje ze stringiem jako parametrem ?
poczytaj 'delphi 6 vademecum profesjonalisty tom 1' strony 275-314.

1 użytkowników online, w tym zalogowanych: 0, gości: 1