C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

CreatePipe()で失敗する


(過去ログ 4 を表示中)

[トピック内 12 記事 (1 - 12 表示)]  << 0 >>

■4764 / inTopicNo.1)  CreatePipe()で失敗する
  
□投稿者/ Ozy 二等兵(1回)-(2006/07/05(Wed) 18:52:28)
Ozy さんの Web サイト

分類:[C#] 


分類:[C#] 

はじめまして。

今、C#で他のプロセスを動かすアプリを作っています。
CreateProcessでプロセスは問題なく起動するのですが、

パイプを作る時に失敗してしまいます。
こんな感じで書いたのですが、問題があるのでしょうか。

/////////////////////////////////////////////////////////////////

[StructLayout(LayoutKind.Sequential)]
public class SECURITY_ATTRIBUTES
{
public int nLength;
public string lpSecurityDescriptor;
public bool bInheritHandle;
}

[DllImport("kernel32.dll", SetLastError = true)]
private static extern int CreatePipe(/*ref*/out int phReadPipe,
/*ref*/out int phWritePipe,
ref SECURITY_ATTRIBUTES lpPipeAttributes,
int nSize);

SECURITY_ATTRIBUTES sa = new SECURITY_ATTRIBUTES();
sa.lpSecurityDescriptor = null;
sa.nLength = Marshal.SizeOf(sa);
sa.bInheritHandle = true;
int hRead, hWrite;

CreatePipe(out hRead, out hWrite, ref sa, 0);

/////////////////////////////////////////////////////////////////

無理ならC++で書けば済む話なのですが、出来ればすべてC#で
書いてしまいたいという気持ちもありまして。。。

よろしくお願いいたします。


- Ozy

0
引用返信 編集キー/
■4764 / inTopicNo.2)  CreatePipe()で失敗する
□投稿者/ Ozy 二等兵(1回)-(2006/07/05(Wed) 18:52:28)
Ozy さんの Web サイト

分類:[C#] 


分類:[C#] 

はじめまして。

今、C#で他のプロセスを動かすアプリを作っています。
CreateProcessでプロセスは問題なく起動するのですが、

パイプを作る時に失敗してしまいます。
こんな感じで書いたのですが、問題があるのでしょうか。

/////////////////////////////////////////////////////////////////

[StructLayout(LayoutKind.Sequential)]
public class SECURITY_ATTRIBUTES
{
public int nLength;
public string lpSecurityDescriptor;
public bool bInheritHandle;
}

[DllImport("kernel32.dll", SetLastError = true)]
private static extern int CreatePipe(/*ref*/out int phReadPipe,
/*ref*/out int phWritePipe,
ref SECURITY_ATTRIBUTES lpPipeAttributes,
int nSize);

SECURITY_ATTRIBUTES sa = new SECURITY_ATTRIBUTES();
sa.lpSecurityDescriptor = null;
sa.nLength = Marshal.SizeOf(sa);
sa.bInheritHandle = true;
int hRead, hWrite;

CreatePipe(out hRead, out hWrite, ref sa, 0);

/////////////////////////////////////////////////////////////////

無理ならC++で書けば済む話なのですが、出来ればすべてC#で
書いてしまいたいという気持ちもありまして。。。

よろしくお願いいたします。


- Ozy

0
引用返信 編集キー/
■4765 / inTopicNo.3)  Re[1]: CreatePipe()で失敗する
□投稿者/ Hongliang 軍曹(61回)-(2006/07/05(Wed) 19:10:19)
Hongliang さんの Web サイト

分類:[C#] 

で、その「失敗」とやらは具体的には何なのでしょうか。

0
引用返信 編集キー/
■4765 / inTopicNo.4)  Re[1]: CreatePipe()で失敗する
□投稿者/ Hongliang 軍曹(61回)-(2006/07/05(Wed) 19:10:19)
Hongliang さんの Web サイト

分類:[C#] 

で、その「失敗」とやらは具体的には何なのでしょうか。

0
引用返信 編集キー/
■4767 / inTopicNo.5)  Re[2]: CreatePipe()で失敗する
□投稿者/ Ozy 二等兵(2回)-(2006/07/05(Wed) 21:00:46)
Ozy さんの Web サイト

分類:[C#] 

あ・・・すみません。
GetLastError()を使うとエラーコード1305が返ってきたのですが、
ERROR_UNKNOWN_REVISION(そのリビジョン レベルは認識されません。)
の意味がよくわかりません。

0
引用返信 編集キー/
■4767 / inTopicNo.6)  Re[2]: CreatePipe()で失敗する
□投稿者/ Ozy 二等兵(2回)-(2006/07/05(Wed) 21:00:46)
Ozy さんの Web サイト

分類:[C#] 

あ・・・すみません。
GetLastError()を使うとエラーコード1305が返ってきたのですが、
ERROR_UNKNOWN_REVISION(そのリビジョン レベルは認識されません。)
の意味がよくわかりません。

0
引用返信 編集キー/
■4771 / inTopicNo.7)  Re[3]: CreatePipe()で失敗する
□投稿者/ Ozy 二等兵(3回)-(2006/07/05(Wed) 21:23:14)
Ozy さんの Web サイト

分類:[C#] 

連投すいません。

SecurityDescriptorがnullではダメなのかな?
と思ったりもするのですが、具体的にどうすれば良いのかが
わからずで・・・。

0
引用返信 編集キー/
■4771 / inTopicNo.8)  Re[3]: CreatePipe()で失敗する
□投稿者/ Ozy 二等兵(3回)-(2006/07/05(Wed) 21:23:14)
Ozy さんの Web サイト

分類:[C#] 

連投すいません。

SecurityDescriptorがnullではダメなのかな?
と思ったりもするのですが、具体的にどうすれば良いのかが
わからずで・・・。

0
引用返信 編集キー/
■4772 / inTopicNo.9)  Re[4]: CreatePipe()で失敗する
□投稿者/ Hongliang 軍曹(62回)-(2006/07/05(Wed) 21:37:14)
Hongliang さんの Web サイト

分類:[C#] 

ふむ。
.NET には値型と参照型があります。C#における struct と class ですね。
名前通り参照型は参照ですので、参照を値渡しするというのは C/C++ でいうポインタ渡しとほぼ同義です。
つまり、マーシャリング(マネージド語・アンマネージド語の相互翻訳)するとき、参照型を値渡しするというのはそのオブジェクトのポインタを渡すように変換されます。
で、それとは別に .NET には参照渡しというのがあります。C# における ref/out ですね。これも、マーシャリングするとポインタ渡しになるように変換されます。
さて、この二つを合わせたらどうなるか。そのまま、ポインタのポインタを渡す事になります。
CreatePipe の引数にはポインタのポインタを指定するようなのは無いですよね。
参照型を値渡しで渡すか、あるいは値型を参照渡しで渡してあげてください。

あと、ハンドルは IntPtr 型で扱うようにしましょう。
.NET 2.0 なら SafeHandle 派生型でより安全に扱えるようにもなります。取っつきにくいですが。

0
引用返信 編集キー/
■4772 / inTopicNo.10)  Re[4]: CreatePipe()で失敗する
□投稿者/ Hongliang 軍曹(62回)-(2006/07/05(Wed) 21:37:14)
Hongliang さんの Web サイト

分類:[C#] 

ふむ。
.NET には値型と参照型があります。C#における struct と class ですね。
名前通り参照型は参照ですので、参照を値渡しするというのは C/C++ でいうポインタ渡しとほぼ同義です。
つまり、マーシャリング(マネージド語・アンマネージド語の相互翻訳)するとき、参照型を値渡しするというのはそのオブジェクトのポインタを渡すように変換されます。
で、それとは別に .NET には参照渡しというのがあります。C# における ref/out ですね。これも、マーシャリングするとポインタ渡しになるように変換されます。
さて、この二つを合わせたらどうなるか。そのまま、ポインタのポインタを渡す事になります。
CreatePipe の引数にはポインタのポインタを指定するようなのは無いですよね。
参照型を値渡しで渡すか、あるいは値型を参照渡しで渡してあげてください。

あと、ハンドルは IntPtr 型で扱うようにしましょう。
.NET 2.0 なら SafeHandle 派生型でより安全に扱えるようにもなります。取っつきにくいですが。

0
引用返信 編集キー/
■4773 / inTopicNo.11)  Re[5]: CreatePipe()で失敗する
□投稿者/ Ozy 二等兵(4回)-(2006/07/05(Wed) 22:01:05)
Ozy さんの Web サイト

分類:[C#] 

なるほど!よくわかりました!!

[DllImport("kernel32.dll", SetLastError = true)]
private static extern int CreatePipe(out IntPtr phReadPipe,
out IntPtr phWritePipe,
SECURITY_ATTRIBUTES lpPipeAttributes,
int nSize);

としておけば良いということですね。
APIはhttp://blog.joycode.com/ghj/archive/2004/05/08/20891.aspx
に載ってたものを使っていたのですが、信用しきりではダメですね。
マーシャリングについても、なんとなくでしか理解していなかったので、
もう少ししっかり勉強しておきます。

どうもありがとうございます!

解決済み
引用返信 編集キー/
■4773 / inTopicNo.12)  Re[5]: CreatePipe()で失敗する
□投稿者/ Ozy 二等兵(4回)-(2006/07/05(Wed) 22:01:05)
Ozy さんの Web サイト

分類:[C#] 

なるほど!よくわかりました!!

[DllImport("kernel32.dll", SetLastError = true)]
private static extern int CreatePipe(out IntPtr phReadPipe,
out IntPtr phWritePipe,
SECURITY_ATTRIBUTES lpPipeAttributes,
int nSize);

としておけば良いということですね。
APIはhttp://blog.joycode.com/ghj/archive/2004/05/08/20891.aspx
に載ってたものを使っていたのですが、信用しきりではダメですね。
マーシャリングについても、なんとなくでしか理解していなかったので、
もう少ししっかり勉強しておきます。

どうもありがとうございます!

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -