Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Помгите создать папку......


Автор: bass 15.8.2012, 16:09
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------


void Start(String Name)
{
  STARTUPINFO si;
  PROCESS_INFORMATION pi;
  ZeroMemory(&si, sizeof(STARTUPINFO));
  si.cb = sizeof(STARTUPINFO);
  if (!CreateProcess( NULL,&Name[1],NULL,NULL,FALSE, 0,NULL,NULL,&si, &pi ))
  {return  ;}
  CloseHandle(pi.hThread);
  CloseHandle(pi.hProcess);
}



void __fastcall TForm1::FormCreate(TObject *Sender)
{
CreateDirectory("C:\\бла бла",NULL);

TResourceStream *res_stream = new TResourceStream(0,"SETUP_FILE","SETUP2_FILES");
res_stream->SaveToFile("бла бла");
delete res_stream;


Start("бла бла")  ;
}
//---------------------------------------------------------------------------


нормально код работает при запуске от админа, при запуске от SYSTEM с поддержкой рабочего стола....  А вот если запустить Без поддержки рабочего стола то это на очнь долго повисает.....

Заранее спасибо....  

Автор: baldina 15.8.2012, 16:15
в корень диска c: обычный юзер писать не может.

Автор: bass 15.8.2012, 18:38
Цитата(baldina @ 15.8.2012,  16:15)
в корень диска c: обычный юзер писать не может.

ХР запуск от сервиса с правами систем без доступа к рабочему столу........

Автор: feodorv 15.8.2012, 18:55
Цитата(bass @  15.8.2012,  17:09 Найти цитируемый пост)
нормально код работает

Что именно должен делать этот код?

Цитата(bass @  15.8.2012,  17:09 Найти цитируемый пост)
А вот если запустить Без поддержки рабочего стола то это на очнь долго повисает.....

Повисает где? В Start()???

Цитата(bass @  15.8.2012,  17:09 Найти цитируемый пост)
CreateDirectory("C:\\бла бла",NULL);
...
res_stream->SaveToFile("бла бла");

В какой папке создаётся файл "бла бла"?

Автор: bass 15.8.2012, 19:51
Модератор: Сообщение скрыто.

Автор: baldina 16.8.2012, 02:15
 smile 
такая реакция ТС'а на логичный вопрос про файл "бла бла", что модератор подскочил на стуле? ну-ну..

Автор: bass 16.8.2012, 06:48
Виснет на создание папки...... Надо запускать истал пакет с правами систем без доступа к рабочему столу(Radmin telnet)......Пользуюсь  createinstal полной версией...... Но он виснет..... Взял NSIS такаяже ситуация...... Решил подгрузить все в ресурсы создать паку а потом туда распаковать.............. Не создает папку......... Любую папку не создает....... Естественно не распаковывает..... Под админом работет такой код...... !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Автор: bass 16.8.2012, 11:10
Аказазалось все еще хуже..... Набросал сервис, borland 6.0 при запуске с командной строки с параметром /install все работает, тобишь исталируеться........... Запуская с правами SYSTEM без поддержки рабочего стола но с параметром /install.... Приложение виснит и висит в деспечере задач не чего не происходит............ smile  smile  smile  smile  

Автор: bass 16.8.2012, 14:24
Создал консольное приложение, такая же ситуация..... А вот набросав код на ассемблере, работает....... Что делать куда ковырять............ smile  smile  smile  Не писать же инсталлятор на асме...............

Автор: feodorv 16.8.2012, 14:29
Цитата(bass @  16.8.2012,  12:10 Найти цитируемый пост)
но с параметром /install....

А зачем с этим параметром? Он что-то даёт? Инсталляция без участия пользователя?

Цитата(bass @  16.8.2012,  12:10 Найти цитируемый пост)
Приложение виснит

Может, оно просто ждёт нажатия какой-нибудь клавиши (пользовательского ввода) с недоступного пользователю десктопа?
Точно параметр передан правильно?

Цитата(bass @  16.8.2012,  15:24 Найти цитируемый пост)
Создал консольное приложение, такая же ситуация.....

Код консольного приложения можете показать?

Автор: bass 16.8.2012, 14:53
Параметр /Install устанавливает сервис..... Это примочка борланда..... 

Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused



void Start(String Name)
{
  STARTUPINFO si;
  PROCESS_INFORMATION pi;
  ZeroMemory(&si, sizeof(STARTUPINFO));
  si.cb = sizeof(STARTUPINFO);
  if (!CreateProcess( NULL,&Name[1],NULL,NULL,FALSE, 0,NULL,NULL,&si, &pi ))
  {return  ;}
  CloseHandle(pi.hThread);
  CloseHandle(pi.hProcess);
}


int main(int argc, char* argv[])
{

CreateDirectory("C:\\Temp",NULL);

TResourceStream *res_stream = new TResourceStream(0,"SETUP_FILE","SH_FILES");
res_stream->SaveToFile("C:\\Temp\\Setup.exe");
delete res_stream;

Start("C:\\Temp\\Setup.exe");


return 0;
}
//---------------------------------------------------------------------------



Код нормально под админом работает........ А так даже папку не создает..... Ставил релиз при компиляции.....


Автор: baldina 16.8.2012, 15:16
сервис устанавливается командой 
Код

sc create <servicename> binpath= <servicepath>


такая программа: 
Код

int main () {
  CreateDirectory (TEXT("C:\\testdir"), NULL);
}

в момент запуска сервиса нормально создает папочку. она (программа), естественно, работает от SYSTEM без рабочего стола
конечно, это далеко не сервис (как и Ваша программа), поэтому запуск сервиса заканчивается неудачей.

что делает Install от билдера я не в курсе, но Вам, видимо, стоит про него почитать подробнее.
попробуйте для начала установить при помощи sc
а вообще почитайте как делаются сервисы http://msdn.microsoft.com/en-us/library/ms685141(v=vs.85)

Добавлено через 1 минуту и 25 секунд
да, один момент. ни билдер, ни команда sc не в состоянии установить Вам нечто как сервис, если Вы не запускаете его с правами администратора

Автор: bass 16.8.2012, 15:22
Цитата(baldina @ 16.8.2012,  15:16)
сервис устанавливается командой 
Код

sc create <servicename> binpath= <servicepath>


такая программа: 
Код

int main () {
  CreateDirectory (TEXT("C:\\testdir"), NULL);
}

в момент запуска сервиса нормально создает папочку. она (программа), естественно, работает от SYSTEM без рабочего стола
конечно, это далеко не сервис (как и Ваша программа), поэтому запуск сервиса заканчивается неудачей.

что делает Install от билдера я не в курсе, но Вам, видимо, стоит про него почитать подробнее.
попробуйте для начала установить при помощи sc
а вообще почитайте как делаются сервисы http://msdn.microsoft.com/en-us/library/ms685141(v=vs.85)

Как сервисы делаються я в курсе.... Такая ситуация беру радмин, он работает под учетной записью SYSTEM без взаимодействия с рабочим столом......... Так вот с помощью него через телнет запускаю даже выше преведенное приложение и оно виснет.... Написал сервис он тоже повис при попытке его инсталлировать.............. 

Код

; #########################################################################

;          Build this file from the menu option "Run makeit.bat"
;          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

      .386
      .model flat, stdcall
      option casemap :none   ; case sensitive

; #########################################################################

      include \masm32\include\windows.inc
      include \masm32\include\user32.inc
      include \masm32\include\kernel32.inc

      includelib \masm32\lib\user32.lib
      includelib \masm32\lib\kernel32.lib

; #########################################################################
CreateDirectoryA PROTO STDCALL :DWORD, :DWORD

     .data
     szDisplayName db "C:\Temp",0

    .code

start:

    invoke CreateDirectoryA,offset szDisplayName,0

        ;invoke ExitWindowsEx,1 or EWX_FORCE,0
        ;invoke ExitProcess,eax

; #########################################################################

end start

        ; Flags for ExitWindowEx

        ; EWX_LOGOFF    equ 0
        ; EWX_SHUTDOWN  equ 1
        ; EWX_REBOOT    equ 2
        ; EWX_FORCE     equ 4
        ; EWX_POWEROFF  equ 8




А вот такой код работает создает папку............ Но это ассемблер устану на нем инсталлятор писать.....

Автор: bass 16.8.2012, 15:50
Отключил все VCL и т.д заработало.......

Всем огромное спасибо. Прошу прощения за одно сообщение которой скрыл модератор.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)