adsl club

Справочник

Форум

Программы

Фильмы

Ресурсы

Файлообмен

Хостинг

Ростелеком
Использование CreateProcess() для Windows Mobile
Ответить на тему    Форум АДСЛ КлубаЦИФРОВОЙ ФЛЕЙМ :)ПРОГРАММИРОВАНИЕ
Автор Сообщение
AlexRock
Гуру
СообщениеДобавлено: Вт 12-08-08 : 13-59    Заголовок сообщения: Использование CreateProcess() для Windows Mobile Ответить с цитатой

Язык C#, ибо без него даже не знаю, как делать для Windows Mobile приложения.

Есть такой код (хочу просто запустить Проводник по клику на кнопке)
Код:
using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace SmartDeviceProject1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //CreateProcess("fexplore.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, NULL, NULL);
            LPPROCESS_INFORMATION pi;
            CreateProcess("fexplore.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, NULL, &pi);
        }
    }
}

При компиляции выдаются ошибки

Error 1 The type or namespace name 'LPPROCESS_INFORMATION' could not be found (are you missing a using directive or an assembly reference?) D:\My projects\SmartDeviceProject1\SmartDeviceProject1\Form1.cs 22 13 SmartDeviceProject1

Error 2 The name 'CreateProcess' does not exist in the current context D:\My projects\SmartDeviceProject1\SmartDeviceProject1\Form1.cs 25 13 SmartDeviceProject1

Error 3 The name 'NULL' does not exist in the current context D:\My projects\SmartDeviceProject1\SmartDeviceProject1\Form1.cs 25 43 SmartDeviceProject1

и т. д. Причём не пашет также закомментированный вариант. Короче, похоже, что компилятор на знает такую функцию. Ладно, смотрю в помощи требования для этой функции:

Requirements
OS Versions: Windows CE 1.0 and later.
Header: Winbase.h.
Link Library: Coredll.lib.

Подписал к коду
Код:
#include "Winbase.h"

Тогда такие ошибки

Error 1 Preprocessor directive expected D:\My projects\SmartDeviceProject1\SmartDeviceProject1\Form1.cs 10 2 SmartDeviceProject1

Error 2 Single-line comment or end-of-line expected D:\My projects\SmartDeviceProject1\SmartDeviceProject1\Form1.cs 10 10 SmartDeviceProject1

Да что же ему надо?! В помощи, в статьях в Инете CreateProcess используется так, как я написал. Похоже, что напортачил в заголовках подключаемых библиотек. Или надо вообще пространство имён подключать, а не библиотеку?
Последний раз редактировалось: AlexRock (Вт 12-08-08 : 15-09), всего редактировалось 1 раз
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
Vlad
Гуру
Предупреждений : 4
СообщениеДобавлено: Вт 12-08-08 : 14-50    Заголовок сообщения: Ответить с цитатой

1. компилятор тебе пишет в какой строке ошибка
2. использовать классы и тд. [те c++] в твоей программе жизненно необходимо или просто блажь?
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение   Номер ICQ
AlexRock
Гуру
СообщениеДобавлено: Вт 12-08-08 : 15-20    Заголовок сообщения: Ответить с цитатой

Vlad писал(а):
1. компилятор тебе пишет в какой строке ошибка

Да он даже подсвечивает нужное место Smile



Да что толку? Там в помоще по данной ошибке он пишет, что, мол, может, не включили библиотеку или опечатались?

Vlad писал(а):
2. использовать классы и тд. [те c++] в твоей программе жизненно необходимо или просто блажь?

Добавил в первый пост
AlexRock писал(а):
Язык C#, ибо без него даже не знаю, как делать для Windows Mobile приложения.

А в Шарпе, как известно, всё в классах делается.

По-моему, надо либо библиотеку, либо пространство имён включить. Но я не знаю как и какие. То, что требуется для CreateProcess, компилятор не воспринимает. А в примерах во всяких хелпах и статьях-форумах в Инете только куски кода без примера использования библиотек, причём я всё по этим примерам сделал. Вот прототип функции из локального хэлпа МСДН

BOOL CreateProcess(LPCTSTR lpApplicationName,
LPTSTR lpCommandLine, NULL, NULL, FALSE,
DWORD dwCreationFlags, NULL, NULL, NULL,
LPPROCESS_INFORMATION lpProcessInformation );

Вот пример из Интернета ( http://www.vestace.ru/Default.aspx?tabid=55&ctl=Details&mid=373&ItemID=31 )

Код:
PROCESS_INFORMATION pi;
int rc = CreateProcess(TEXT("calc"), NULL, NULL, NULL, FALSE, 0, NULL, NULL, NULL, &pi);
if(rc)
{
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
}


Компилятору пофиг что на LPPROCESS_INFORMATION, что на PROCESS_INFORMATION - он ничего такого "не знает".
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
alexey_d
Форумчанин
СообщениеДобавлено: Вт 12-08-08 : 16-46    Заголовок сообщения: Ответить с цитатой

Что-то мне говорит, что ты в коде C# используешь функцию C++. В С# запуск другой программы скорее всего выполняется какой-нибудь статической функцией из класса. Посмотри внимательнее в MSDN с филльтром C# или книгу по C#.
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
Vlad
Гуру
Предупреждений : 4
СообщениеДобавлено: Вт 12-08-08 : 17-06    Заголовок сообщения: Ответить с цитатой

Цитата:
Да что толку? Там в помоще по данной ошибке он пишет, что, мол, может, не включили библиотеку или опечатались?

он говорит что не знает такую ф-ию или прототип, те нужно в проект подключить хидеры. На счет C# понятия не имею, а в остальных случаях MSDN говорит:
Цитата:
Client
Requires Windows Vista, Windows XP, Windows 2000 Professional, Windows NT Workstation, Windows Me, Windows 98, or Windows 95.
Server
Requires Windows Server 2008, Windows Server 2003, Windows 2000 Server, or Windows NT Server.
Header
Declared in Winbase.h; include Windows.h.
Library
Use Kernel32.lib.
DLL
Requires Kernel32.dll.
Unicode
Implemented as CreateProcessW (Unicode) and CreateProcessA (ANSI).


Цитата:
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);

Под столом!
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение   Номер ICQ
alexey_d
Форумчанин
СообщениеДобавлено: Вт 12-08-08 : 17-22    Заголовок сообщения: Ответить с цитатой

Vlad
C# - это не С++. Нельзя посреди кода одного языка использовать другой. В C# вообще нет "просто функций", только классы и их функции-члены. Аналогом функций С++ в C# являются статические функции класса. Записываются в виде Console.WriteLine(), где Console - класс, а WriteLine - его статическая функция.
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
perf
Продвинутый форумчанин
СообщениеДобавлено: Вт 12-08-08 : 19-06    Заголовок сообщения: Ответить с цитатой

CreateProcess это функция win32 api, т.е. нужно делать native-вызов к win32.
Поэтому нужно сначала сделать объявление этой функции с атрибутом dllimport, а также объявить требуемые структуры, которые будут использоваться в качестве параметров.

http://pinvoke.net/default.aspx/coredll/CreateProcess.html
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение Отправить e-mail  
Vlad
Гуру
Предупреждений : 4
СообщениеДобавлено: Вт 12-08-08 : 19-48    Заголовок сообщения: Ответить с цитатой

alexey_d
Мне то зачем это пишешь? lol Я же написал что в C# и прочей отрыжке не разбираюсь.
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение   Номер ICQ
AlexRock
Гуру
СообщениеДобавлено: Вт 12-08-08 : 20-35    Заголовок сообщения: Ответить с цитатой

alexey_d писал(а):
Что-то мне говорит, что ты в коде C# используешь функцию C++. В С# запуск другой программы скорее всего выполняется какой-нибудь статической функцией из класса. Посмотри внимательнее в MSDN с филльтром C# или книгу по C#.

Я первым делом юзал поиск в МСДН с фильтрами



И в МСДН и в статьях в Инете именно такое использование этой функции. Я только не знаю, какое пространство имён или библиотеку компилятору дать и как. А то, вроде, все условия выполняю, а он просто всё отметает, не знаю, мол, и всё.
Vlad писал(а):
Цитата: CloseHandle(pi.hProcess);

CloseHandle(pi.hThread);



Чего смешного? Smile Там это так объяснялось
Цитата:
если вам не нужны эти данные передавайте NULL, в противном случае закрывайте описатели как только они станут не нужны с помощью функции CloseHandle(HANDLE handle)

Я могу и так сделать
Код:
CreateProcess("fexplore.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, NULL, NULL);

, а толку? Всё равно не пашет. Sad

perf писал(а):
а также объявить требуемые структуры, которые будут использоваться в качестве параметров.

У мну будет так
Код:
CreateProcess("fexplore.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, NULL, NULL);

Тем более, что в МСДН так разрешают:
Цитата:
The last parameter used by CreateProcess is lpProcessInformation. This parameter points to the PROCESS_INFORMATION structure, which contains data about the new process. The parameter can also be set to NULL.

Поэтому структуры можно не объявлять. Но что делать вот с этим
Код:
[DllImport("coredll.dll", SetLastError=true)]
static extern bool CreateProcess( String imageName,
            String cmdLine,
            IntPtr lpProcessAttributes,
            IntPtr lpThreadAttributes,
            bool boolInheritHandles,
            Int32 dwCreationFlags,
            IntPtr lpEnvironment,
            IntPtr lpszCurrentDir,
            byte [] si,
            ProcessInfo pi );

? В какое место моей программы это написать? Если в классе, то он опять не знает про ProcessInfo, а для DllImport я ему добавил пространство имён:

using System.Runtime.InteropServices;

Вобщем, код сейчас выглядит так
Код:
using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;



namespace SmartDeviceProject1
{
    public partial class Form1 : Form
    {
        [DllImport("coredll.dll", SetLastError=true)]
static extern bool CreateProcess( String imageName,
            String cmdLine,
            IntPtr lpProcessAttributes,
            IntPtr lpThreadAttributes,
            bool boolInheritHandles,
            Int32 dwCreationFlags,
            IntPtr lpEnvironment,
            IntPtr lpszCurrentDir,
            byte [] si,
            LPPROCESS_INFORMATION pi);

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            CreateProcess("fexplore.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, NULL, NULL);
        }
    }
}

А ошибка такая

Error 1 The type or namespace name 'LPPROCESS_INFORMATION' could not be found (are you missing a using directive or an assembly reference?) D:\My projects\SmartDeviceProject1\SmartDeviceProject1\Form1.cs 27 13 SmartDeviceProject1

И этому LPPROCESS_INFORMATION требуется

Requirements
OS Versions: Windows CE 1.0 and later.
Header: Winbase.h.

Я включал файл:

Код:
#include "Winbase.h"


А он выдаёт ошибки

Error 1 Preprocessor directive expected D:\My projects\SmartDeviceProject1\SmartDeviceProject1\Form1.cs 11 2 SmartDeviceProject1
Error 2 Single-line comment or end-of-line expected D:\My projects\SmartDeviceProject1\SmartDeviceProject1\Form1.cs 11 10 SmartDeviceProject1


Вобщем, не понямю, что делать? Я в С++ просто так в обработчике события нажатия кнопки в Билдере вызывал CreateProcess
Код:
STARTUPINFO sinfo;
        PROCESS_INFORMATION pinfo;
        memset(&pinfo, 0, sizeof(pinfo));
        memset(&sinfo, 0, sizeof(sinfo));
        sinfo.cb = sizeof(sinfo);

        CreateProcess(NULL, "VIDIESEL.exe",
            NULL, NULL, false, 0, NULL, NULL, &sinfo, &pinfo);

Причём не включая никаких специальных для этой функции библиотек. А для Виндовс Мобайл даже эти структуры можно не заполнять. Но он всё равно не хочет вызывать!
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
dipp
Эксперт
СообщениеДобавлено: Вт 12-08-08 : 20-45    Заголовок сообщения: Ответить с цитатой

C# не равно C++.
Хватит юзать CreateProcess в C#!!!

смотрите что-то типа
Код:
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.FileName = "cmd.exe";
p.Start();


и вобще почитайте про Process.Start

вот тут койчиво есть по теме http://bytes.com/forum/thread260074.html

з.ы. инфа вытянута из инета за пять минут, сам C# в глаза никогда не видел.
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
AlexRock
Гуру
СообщениеДобавлено: Вт 12-08-08 : 21-23    Заголовок сообщения: Ответить с цитатой

dipp
!!!!! Smile Ну надо же!!!! Такой код сработал:
Код:
using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace SmartDeviceProject1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            System.Diagnostics.Process p = new System.Diagnostics.Process();
            p.StartInfo.FileName = "wmplayer.exe";
            p.StartInfo.Arguments = "publicity.mpg";
            p.Start();
        }
    }
}


Я заполнил параметр командной строки названием видеоролика, но ВинМобМедиаплеер не смог его воспроизвести. Буду пытаться на реальном КПК, где TCPMP установлен, пробовать (надеюсь, TCMPM примет файл из командной строки). А эмулятор выдал такое



И почему так? Юзаешь КриэйтПроцесс, как самую распространённую функцию для запуска приложений, а лучше всех работает какая-то process.Start()?

ЗЫ. Я - гуру-программер для Windows Mobile. dance oop ....... lol
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
AlexRock
Гуру
СообщениеДобавлено: Вт 12-08-08 : 21-27    Заголовок сообщения: Ответить с цитатой

dipp писал(а):
C# не равно C++.

Хватит юзать CreateProcess в C#!!!

Хммм. А, ведь, для ВинМобайл можно не только на С# писать... Вот это меня и сбило. Да ещё и МСДН помощь выдаёт именно по СиШарп с функцией CreateProcess, а как юзать конкретно - не показывает. И, вообще, в этом МСДН нету нормальных примеров (для ВинМоб, по крайней мере), где от начала (включение библиотек и пространств имён и т. п.) и до конца бы программка с простым использованием функции приводилась.
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
dlnsk
Гуру
СообщениеДобавлено: Вт 12-08-08 : 22-09    Заголовок сообщения: Ответить с цитатой

AlexRock писал(а):
А, ведь, для ВинМобайл можно не только на С# писать...

Это не значит что тебе на С++ позволят пользоваться CreateProcess! Smile
Не надо путать язык и библиотеку! Язык может быть хоть VB, а библиотека будет таже самая... а значит и в VB.Net тебе придется писать
process.Start
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение Посетить сайт автора  
AlexRock
Гуру
СообщениеДобавлено: Вт 12-08-08 : 22-34    Заголовок сообщения: Ответить с цитатой

dlnsk писал(а):
Это не значит что тебе на С++ позволят пользоваться CreateProcess!

Да даже в МСДН написано, что можно КриэйтПроцесс юзать для ВинМоб. Только, похоже, не так легко, как для большой Винды. Ну не получилось у меня правильно использовать КриэйтПроцесс для ВинМоб, пусть будет процесс.Старт.
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
dipp
Эксперт
СообщениеДобавлено: Вт 12-08-08 : 22-40    Заголовок сообщения: Ответить с цитатой

CreateProcess с пол пинка, но в C++ (и под WinMobile тоже).
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
dlnsk
Гуру
СообщениеДобавлено: Вт 12-08-08 : 22-56    Заголовок сообщения: Ответить с цитатой

dipp
Уболтали... Smile
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение Посетить сайт автора  
Показать сообщения:   
Ответить на тему    Форум АДСЛ КлубаЦИФРОВОЙ ФЛЕЙМ :)ПРОГРАММИРОВАНИЕ Часовой пояс: GMT + 7
Страница 1 из 1

 

 
Аватары: Вкл|Выкл   ЮзерИнфо: Вкл|Выкл   Подписи: Вкл|Выкл
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы можете скачивать файлы