Автор |
Сообщение |
AlexRock Гуру |
|
Язык 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
|
|
1. компилятор тебе пишет в какой строке ошибка
2. использовать классы и тд. [те c++] в твоей программе жизненно необходимо или просто блажь? |
|
|
|
|
AlexRock Гуру |
|
Vlad писал(а): |
1. компилятор тебе пишет в какой строке ошибка |
Да он даже подсвечивает нужное место
Да что толку? Там в помоще по данной ошибке он пишет, что, мол, может, не включили библиотеку или опечатались?
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 Форумчанин |
|
Что-то мне говорит, что ты в коде C# используешь функцию C++. В С# запуск другой программы скорее всего выполняется какой-нибудь статической функцией из класса. Посмотри внимательнее в MSDN с филльтром C# или книгу по C#. |
|
|
|
|
Vlad Гуру Предупреждений : 4
|
|
Цитата: |
Да что толку? Там в помоще по данной ошибке он пишет, что, мол, может, не включили библиотеку или опечатались? |
он говорит что не знает такую ф-ию или прототип, те нужно в проект подключить хидеры. На счет 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); |
|
|
|
|
|
alexey_d Форумчанин |
|
Vlad
C# - это не С++. Нельзя посреди кода одного языка использовать другой. В C# вообще нет "просто функций", только классы и их функции-члены. Аналогом функций С++ в C# являются статические функции класса. Записываются в виде Console.WriteLine(), где Console - класс, а WriteLine - его статическая функция. |
|
|
|
|
perf Продвинутый форумчанин |
|
CreateProcess это функция win32 api, т.е. нужно делать native-вызов к win32.
Поэтому нужно сначала сделать объявление этой функции с атрибутом dllimport, а также объявить требуемые структуры, которые будут использоваться в качестве параметров.
http://pinvoke.net/default.aspx/coredll/CreateProcess.html |
|
|
|
|
Vlad Гуру Предупреждений : 4
|
|
alexey_d
Мне то зачем это пишешь? Я же написал что в C# и прочей отрыжке не разбираюсь. |
|
|
|
|
AlexRock Гуру |
|
alexey_d писал(а): |
Что-то мне говорит, что ты в коде C# используешь функцию C++. В С# запуск другой программы скорее всего выполняется какой-нибудь статической функцией из класса. Посмотри внимательнее в MSDN с филльтром C# или книгу по C#. |
Я первым делом юзал поиск в МСДН с фильтрами
И в МСДН и в статьях в Инете именно такое использование этой функции. Я только не знаю, какое пространство имён или библиотеку компилятору дать и как. А то, вроде, все условия выполняю, а он просто всё отметает, не знаю, мол, и всё.
Vlad писал(а): |
Цитата: CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
|
Чего смешного? Там это так объяснялось
Цитата: |
если вам не нужны эти данные передавайте NULL, в противном случае закрывайте описатели как только они станут не нужны с помощью функции CloseHandle(HANDLE handle) |
Я могу и так сделать
Код: |
CreateProcess("fexplore.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, NULL, NULL); |
, а толку? Всё равно не пашет.
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 Эксперт |
|
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 Гуру |
|
|
|
|
AlexRock Гуру |
|
dipp писал(а): |
C# не равно C++.
Хватит юзать CreateProcess в C#!!! |
Хммм. А, ведь, для ВинМобайл можно не только на С# писать... Вот это меня и сбило. Да ещё и МСДН помощь выдаёт именно по СиШарп с функцией CreateProcess, а как юзать конкретно - не показывает. И, вообще, в этом МСДН нету нормальных примеров (для ВинМоб, по крайней мере), где от начала (включение библиотек и пространств имён и т. п.) и до конца бы программка с простым использованием функции приводилась. |
|
|
|
|
dlnsk Гуру |
|
AlexRock писал(а): |
А, ведь, для ВинМобайл можно не только на С# писать... |
Это не значит что тебе на С++ позволят пользоваться CreateProcess!
Не надо путать язык и библиотеку! Язык может быть хоть VB, а библиотека будет таже самая... а значит и в VB.Net тебе придется писать
process.Start |
|
|
|
|
AlexRock Гуру |
|
dlnsk писал(а): |
Это не значит что тебе на С++ позволят пользоваться CreateProcess! |
Да даже в МСДН написано, что можно КриэйтПроцесс юзать для ВинМоб. Только, похоже, не так легко, как для большой Винды. Ну не получилось у меня правильно использовать КриэйтПроцесс для ВинМоб, пусть будет процесс.Старт. |
|
|
|
|
dipp Эксперт |
|
CreateProcess с пол пинка, но в C++ (и под WinMobile тоже). |
|
|
|
|
dlnsk Гуру |
|
dipp
Уболтали... |
|
|
|
|
|
Аватары: Вкл|Выкл ЮзерИнфо: Вкл|Выкл Подписи: Вкл|Выкл
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы можете скачивать файлы
|
|