Jump to content

Recommended Posts

Posted

olá,

Alguém sabe como partilhar uma pasta em delphi? Estou a usar o Delphi 2010.

Já experimentei alguns exemplos que encontrei, a pasta fica partilhada, mas fica inacessivel ao tentar aceder a partir de outros pc em rede.

Posted

Como assim?

Queres criar uma partilha de Windows a partir de um software em Delphi?

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted

Boa noite,

Se queres criar uma utilizando a implementação que o MS Windows traz, do protocolo SMB, vais ter algumas dificuldades a lidar com previlégios necessários à tua aplicação.

Se procurares bem, vais ver que encontras algumas implementações que funcionam, pelo menos no Windows 7.

type
   SHARE_INFO_2 = record
  shi2_netname : pWideChar;
  shi2_type    : DWORD;
  shi2_remark  : pWideChar;
  shi2_permissions : DWORD;
  shi2_max_uses    : DWORD;
  shi2_current_uses: DWORD;
  shi2_path	    : pWideChar;
  shi2_passwd	  : pWideChar;
   end;
   PSHARE_INFO_2 = ^SHARE_INFO_2;
   const
  NERR_SUCCESS   = 0;
  STYPE_DISKTREE = 0;
  STYPE_PRINTQ   = 1;
  STYPE_DEVICE   = 2;
  STYPE_IPC	  = 3;
  ACCESS_READ    = $01;
  ACCESS_WRITE   = $02;
  ACCESS_CREATE  = $04;
  ACCESS_EXEC    = $08;
  ACCESS_DELETE  = $10;
  ACCESS_ATRIB   = $20;
  ACCESS_PERM    = $40;
  ACCESS_ALL	 = ACCESS_READ or ACCESS_WRITE or ACCESS_CREATE or ACCESS_EXEC or ACCESS_DELETE or ACCESS_ATRIB or ACCESS_PERM;

 function NetShareAdd(servername: pWideChar;
level: DWORD; buf: PBYTE; parm_err: PDWORD): NET_API_STATUS;
				    stdcall; external 'NetAPI32.dll' name 'NetShareAdd';

{Implementação}


procedure TForm1.Button2Click(Sender: TObject);
var
 AShareInfo : PSHARE_INFO_2;
 parmError  : DWORD;
begin
 CreateDir('D:\test_folder');
 AShareInfo := New(PSHARE_INFO_2);
 try
   with AShareInfo^ do
   begin
  shi2_netname := WideString('Test_sharing');
  shi2_type    := STYPE_DISKTREE;
  shi2_remark  := nil;
  shi2_permissions := ACCESS_ALL;
  shi2_max_uses    := DWORD(-1); // Maximum allowed
  shi2_current_uses:= 0;
  shi2_path	    := WideString('D:\test_folder');
  shi2_passwd	  := nil;
   end;
   if (NetShareAdd(nil, 2, PBYTE(AShareInfo), @parmError) <> NERR_SUCCESS)then
 ShowMessage(IntToStr(parmError));
 finally
   FreeMem(AShareInfo, SizeOf(PSHARE_INFO_2));
 end;
end;
{disponivel no torry's delphi page}

Cordiais cumprimentos,

Apocsantos

"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Posted

Sim quero criar uma partilha de Windows a partir de um software em Delphi.

Obrigado ApocSantos, já experimentei o seu exemplo, mas ao tentar aceder à pasta partilhada por outro pc dá acesso negado.

Posted

Bom dia,

Dependendo da versão do Windows, tal como tinha indicado, vão aparecer problemas com a segurança do Windows e com a autenticação. Penso que não se trantando de uma rede onde exista um controlador de dominio e um dominio ActiveDirectory, as maquinas têm de se autenticar umas nas outras. Mas isso são configurações do Windows.

O primeiro teste que eu faria, era deixar a aplicação criar a pasta partilhada e depois em vez de aceder directamente no "My Computer", executar o comando net use \\nome_da_maquina\nome_da_partilha, e ver se a partilha funciona. Se funcionar já se tem um ponto de partida, para resolver o problema, se não funcionar também se fica com um bom ponto de partida para encontrar uma solução.

Cordiais cumprimentos,

Apocsantos

  • Vote 2

"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Posted

Dependendo da versão do Windows, tal como tinha indicado, vão aparecer problemas com a segurança do Windows e com a autenticação. Penso que não se trantando de uma rede onde exista um controlador de dominio e um dominio ActiveDirectory, as maquinas têm de se autenticar umas nas outras. Mas isso são configurações do Windows.

Excelente explicação.

O que quer dizer, que mesmo que funcione no seu (Ana789) ambiente de produção, com o seu Windows, com os seus computadores, com a sua rede (c/ ou s/ domínio) pode não ser 100% garantido que funcione em todas as situações, visto que vai depender do sistema e configurações do cliente final.

Não sei qual será o objectivo de criar a tal partilha, mas se fosse eu deixava a parte de criar a partilha para um procedimento "manual" de instalação, dependendo do Windows (ou vários Windows de versões diferentes que o cliente tenha instalado no seu parque de máquinas).

  • Vote 1
Posted

Excelente explicação.

O que quer dizer, que mesmo que funcione no seu (Ana789) ambiente de produção, com o seu Windows, com os seus computadores, com a sua rede (c/ ou s/ domínio) pode não ser 100% garantido que funcione em todas as situações, visto que vai depender do sistema e configurações do cliente final.

Não sei qual será o objectivo de criar a tal partilha, mas se fosse eu deixava a parte de criar a partilha para um procedimento "manual" de instalação, dependendo do Windows (ou vários Windows de versões diferentes que o cliente tenha instalado no seu parque de máquinas).

concordo!

  • 5 months later...
Posted

Boa noite,

Se queres criar uma utilizando a implementação que o MS Windows traz, do protocolo SMB, vais ter algumas dificuldades a lidar com previlégios necessários à tua aplicação.

Se procurares bem, vais ver que encontras algumas implementações que funcionam, pelo menos no Windows 7.

type
SHARE_INFO_2 = record
  shi2_netname : pWideChar;
  shi2_type	: DWORD;
  shi2_remark  : pWideChar;
  shi2_permissions : DWORD;
  shi2_max_uses	: DWORD;
  shi2_current_uses: DWORD;
  shi2_path		: pWideChar;
  shi2_passwd	  : pWideChar;
end;
PSHARE_INFO_2 = ^SHARE_INFO_2;
const
  NERR_SUCCESS   = 0;
  STYPE_DISKTREE = 0;
  STYPE_PRINTQ   = 1;
  STYPE_DEVICE   = 2;
  STYPE_IPC	  = 3;
  ACCESS_READ	= $01;
  ACCESS_WRITE   = $02;
  ACCESS_CREATE  = $04;
  ACCESS_EXEC	= $08;
  ACCESS_DELETE  = $10;
  ACCESS_ATRIB   = $20;
  ACCESS_PERM	= $40;
  ACCESS_ALL	 = ACCESS_READ or ACCESS_WRITE or ACCESS_CREATE or ACCESS_EXEC or ACCESS_DELETE or ACCESS_ATRIB or ACCESS_PERM;

 function NetShareAdd(servername: pWideChar;
level: DWORD; buf: PBYTE; parm_err: PDWORD): NET_API_STATUS;
					stdcall; external 'NetAPI32.dll' name 'NetShareAdd';

{Implementação}


procedure TForm1.Button2Click(Sender: TObject);
var
 AShareInfo : PSHARE_INFO_2;
 parmError  : DWORD;
begin
 CreateDir('D:\test_folder');
 AShareInfo := New(PSHARE_INFO_2);
 try
with AShareInfo^ do
begin
  shi2_netname := WideString('Test_sharing');
  shi2_type	:= STYPE_DISKTREE;
  shi2_remark  := nil;
  shi2_permissions := ACCESS_ALL;
  shi2_max_uses	:= DWORD(-1); // Maximum allowed
  shi2_current_uses:= 0;
  shi2_path		:= WideString('D:\test_folder');
  shi2_passwd	  := nil;
end;
if (NetShareAdd(nil, 2, PBYTE(AShareInfo), @parmError) <> NERR_SUCCESS)then
 ShowMessage(IntToStr(parmError));
 finally
FreeMem(AShareInfo, SizeOf(PSHARE_INFO_2));
 end;
end;
{disponivel no torry's delphi page}

Cordiais cumprimentos,

Apocsantos

Muito bom seu post!

Estou com um erro:

[DCC Error] Unit27.pas(95): E2003 Undeclared identifier: 'NET_API_STATUS'

Alguma dica ? Estou tentando compartilhar uma pasta na rede, via linha de código Delphi

Abraços !

Posted (edited)

Muito bom seu post!

Estou com um erro:

[DCC Error] Unit27.pas(95): E2003 Undeclared identifier: 'NET_API_STATUS'

Alguma dica ? Estou tentando compartilhar uma pasta na rede, via linha de código Delphi

Abraços !

Experimenta incluir esta unit: http://svn.nldelphi.com/nldelphi/opensource/ngln/NetAPI.pas

(precisarás da dll netapi32.dll: http://download.dll-files.com/8ce1a6d16b9077e91e192499eb611c5f/netapi32.zip?0WLgUBYKkO)

Edited by nunopicado

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted

Boa tarde !

Muito obrigado pela reposta e pela atenção....

O erro ainda permanece... Teria como demonstrar como alterar a permissão de compartilhamento da pasta ??

Pois a alteração em permissões na aba de segurança para os usuários logados na máquina, eu consegui alterar, adicionar, remover.

Mais as permissões para o compartilhamento não, apenas consigo compartilha a pasta e visualizar... usando de outros comandos....

Obrigado, no aguardo!!

Posted

Eu nunca usei isto, não te sei dizer pormenores. O ApocSantos é que talvez saiba.

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.