Izwikwane na File

18 отговора 493 прегледа
#1

Izwikwane na File

Nqkoy ako mi pomogne po wuprosa shte sum mnogo dowolen!!!!!

Imam edna mnogo spletena situacia.

Izpolzwam ShellExecute za da izwikam edin *.Rtf file i raboti ako q napisha w samata mi programa!!!
No kogato q sloja w DLL i ot tam se startirwa dushternata mi programa gurmi na poraziq!! Grashka w cheteneto na nqkoy si adress.

Zashto ???

Ili ako moje da mi kajete druga funkciq za izwikwane na *.Rtf

blagodarq predwaritelno!!!

Отговор
в отговор на Student #2

Re: Izwikwane na File

HINSTANCE ShellExecute(

HWND hwnd, // handle to parent window TUK ti e problema
LPCTSTR lpOperation, // pointer to string that specifies operation to perform
LPCTSTR lpFile, // pointer to filename or folder name string
LPCTSTR lpParameters, // pointer to string that specifies executable-file parameters
LPCTSTR lpDirectory, // pointer to string that specifies default directory
INT nShowCmd // whether file is shown when opened
);

Отговор
в отговор на Student #3

Re: Izwikwane na File

Пробвай WinExec, тука има пример
[линк]

чети и дишай по-леко
Отговор
в отговор на wizard #4

Re: Izwikwane na File

Znachi kato cqlo funkciqta mi predstawlqwa Taka koqto si se namira w otdelen DLL i i se podawat posle parametri :

function ExecuteFile(const FileName, Params, DefaultDir: string;
ShowCmd: Integer): THandle;
var
zFileName, zParams, zDir: array[0..79] of Char;
Text : String;

begin

Result := ShellExecute(Application.MainForm.Handle,nil {'explore'},
StrPCopy(zFileName, FileName), StrPCopy(zParams, Params),
StrPCopy(zDir, DefaultDir), ShowCmd);
case Result of
0: Text :='The operating system is out of memory or resources.';
else
Text := '';
end;
if Text <> '' then
Showmessage(Text);
end;


Mislq Handleto si go wzimam normalno A spored was ????

Отговор
в отговор на Student #5

Re: Izwikwane na File

За грешката не знам, ама стила на писане е ужасно разточен - без да искам да те обиждам.
Например можеш да пишеш така:

Result := ShellExecute(Application.MainForm.Handle,nil {'explore'},
pchar(FileName), pchar(Params), pchar(DefaultDir), ShowCmd);
if Result<>0 then
ShowMessage ('The operating system is out of memory or resources.');

За да провериш дали проблема е в манипулатора на главния прозорец (Application.MainForm.Handle) можеш да опиташ две неща:
1) да го предадеш като параметър на функцията
2) да ползваш вместо него 0

Да не говорим, че от чисто практична гледна точка директното извикване на ShellExecute не е по трудно от извикването на функцията от DLL, т.е. за мен е непонятно защо въобще се пише въпросната функция.

чети и дишай по-леко
Отговор
в отговор на Pechenia #6

Re: Izwikwane na File

Ami izwikawaneto na funciqta sluji za da startira edin *.rtf file na koito se predawat stoynostti ot Zaywki( TQuery ) i sled towa se izwejdat na ekrana!!
Blagodarq shte probwam s twoq suwet puk dano da stane to interestnoto e che pri otdelna programa ne dawa greshka samo kogato se wika ot Dll'a ??!!!@##$#

Отговор
в отговор на Pechenia #7

Re: Izwikwane na File

i s createprocess bi trqbvalo da stane, prosto za window davash nil. Ne sum siguren...

by Waz Gaa
[email protected]
Отговор
в отговор на Waz Gaa #8

Re: Izwikwane na File

Wij za CreateProcec ne bqh se setil shte wzema da go probram i negio dano da stane!!!!

Отговор
в отговор на Student #9

Re: Izwikwane na File

Nqma kakvo da go probvash, az se oburkah. Imah previd ShellExecute, no vmesto handle na prozorec da zadavash nil

by Waz Gaa
[email protected]
Отговор
в отговор на Student #10

Re: Izwikwane na File

Написал ли си
uses ShareMem;

{ 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. }

Отговор
в отговор на mn_t #11

Re: Izwikwane na File

Da izpolzwam ShareMem to towa e zadyljitelno uslowie!!!

A s CreateProces nishto ne stawa a kato probwah da dam na Handleto - nil weche ni izkarwa Acces Voalition w drug adres ne w predishniq!!!
Blagodarq wse pak za usiliqta koito pokazahte shte wzema da se otkaja ot DLL mislq che toy mi zabranqwa po nqkakuw nachin izpolzwaneto na ShellExecute i drugi funcii ot tazi biblioteka!!!!

:(

Отговор
в отговор на Student #12

Re: Izwikwane na File

А проверил ли си:
{ 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...

...щото аз си paste-нах твоята процедура и при мен тръгна.

Отговор
в отговор на Formal #13

Re: Izwikwane na File

Ama tq funciqta si wurvi w normalno *.exe no kogato q wikam prez Dll gurmi!!!

DA ShareMem mi e pirwata deklarirana biblioteka w Uses clausata!!!!!

Towa purwoto neshto koeto prowerih!!!!

Отговор
в отговор на Student #14

Re: Izwikwane na File

А при мене върви и през .dll. Ей тва тръгна:


library lib;

{ 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
ShareMem,
Windows,
Forms,
SysUtils,
ShellApi,
Dialogs;

{$R *.RES}

function ExecuteFile(const FileName, Params, DefaultDir: string;
ShowCmd: Integer): THandle;
var
zFileName, zParams, zDir: array[0..79] of Char;
Text : String;

begin

Result := ShellExecute(Application.MainForm.Handle,nil {'explore'},
StrPCopy(zFileName, FileName), StrPCopy(zParams, Params),
StrPCopy(zDir, DefaultDir), ShowCmd);
case Result of
0: Text :='The operating system is out of memory or resources.';
else
Text := '';
end;
if Text <> '' then
Showmessage(Text);
end;

exports ExecuteFile name 'ExecuteFile';


begin
end.

А тва е извикването:

unit app;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
TForm1 = class(TForm)
procedure FormShow(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

function ExecuteFile(const FileName, Params, DefaultDir: string;
ShowCmd: Integer): THandle; external 'lib.dll';

implementation

{$R *.DFM}

procedure TForm1.FormShow(Sender: TObject);
begin
ExecuteFile('c:\temp\file.rtf', 'explore', '', SW_SHOW);
end;

end.



Под 98SE/Delphi5

Отговор
в отговор на mn_t #15

Re: Izwikwane na File

Абсолютно същото нещо, само че на събитие Button1Click:

procedure TForm1.Button1Click(Sender: TObject);

begin
ExecuteFile('c:\temp\file.rtf', 'explore', '', SW_SHOW);
end;

-
-- Access violation @ address 00267D93 in module lib.dll. Read of address 00000180

Windows 2000 server, D6

PS: Ако го оставя на OnFormShow не се случва нищо.

-------------
Искам да знам какво мисли Бог - останалото са подробности. (Einstein)
Отговор
в отговор на z_free #16

Re: Izwikwane na File

А ако не използваме StrPCopy, както предложи Pechenia ... ако ти се занимава де, че при мене няма 2k...

Отговор
в отговор на mn_t #17

Re: Izwikwane na File

Ако говориш за:

Result := ShellExecute(Application.MainForm.Handle,nil {'explore'}, 

pchar(FileName), pchar(Params), pchar(DefaultDir), ShowCmd);
if Result<>0 then
ShowMessage ('The operating system is out of memory or resources.');


-
- едва ли проблема да е в StrPCopy (пробвах го все пак - рейзва същия ексепшън). Това, което забелязах е, че независимо дали го пишеш по разточителния начин, или не, размера на DLL-ла си остава същия (382976 bytes) и вероятно структурата му е същата. Сега обаче не мога да го гледам задълбочено това нещо.....

-------------
Искам да знам какво мисли Бог - останалото са подробности. (Einstein)

Редактирано от z_free на

Отговор
в отговор на z_free #18

Re: Izwikwane na File

Ami da probwah go i s PChar no reshkata si ostawa wse sushtata Nqma znachka az weche gledam za drug nachin ako stane shte go publikuwam w foruma!!!

10x na wsichki

Отговор
в отговор на Student #19

Re: Izwikwane na File

Neznam kakvo tochno si napravil - prosto syvet - proveri si settingite na kompilatora i debugera - neznam - prosto pogledni .....

Отговор