お世話になります。
Cで作ったDLLをC#で使用についてお聞きしたいです。
DLL側にてprintf関数を使用し標準出力している部分があります。
そこで表示している文字列をC#側で自由に扱うためにはどのように処理したらよいのでしょうか?
例えばprintf関数で表示してる文字をメッセージボックスで表示するといったことがしたいです。
お手数ですが、何卒よろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
以下のようにすると、textBox1 に Hello が入ります。
Console.SetOut() で標準出力を文字列にリダイレクトしています。
C#
1var sb = new StringBuilder(); 2Console.SetOut(new StringWriter(sb)); 3Console.WriteLine("Hello"); 4textBox1.Text = sb.ToString();
###追記
上記でできるので、printf も可能だろうと思っていたのですが、実際に確かめてみると無理でした。
DLL内のprintf()による出力を得たいは、ご本人かもしれませんが、全く同じ問題ですね。
該当 dll を読み込む別プロセスを用意して、その Process.StandardOutput をとればできるかもしれませんが、いずれにせよ面倒な手順が必要かもしれません。
###追記(別プロセスを使った方法)
次の C ソースをコンパイルして called.dll を作ります。
C
1__declspec(dllexport) void main(void) 2{ 3 printf("%s\n", "Hello World!"); 4}
次の C# ソースから caller.exe を作ります。
これは C ソースから作られた dll のメソッドを呼び出すだけのプログラムです。
このソースからは C の main() を単純に呼び出すことしかできませんが、static void Main(string args[]) としてコマンドライン引数を与えることで他のメソッドにも対応できると思います。
C#
1using System; 2using System.Runtime.InteropServices; 3 4static class Program 5{ 6 [STAThread] 7 static void Main() 8 { 9 main(); 10 } 11 12 [DllImport(@"...\called.dll", CallingConvention=CallingConvention.StdCall)] 13 static extern void main(); 14}
次の C# ソースはアプリ本体です。
C#
1using System; 2using System.Diagnostics; 3using System.Windows.Forms; 4 5namespace WindowsFormsApplication1 6{ 7 public partial class Form1 : Form 8 { 9 public Form1() 10 { 11 InitializeComponent(); 12 } 13 14 private void button1_Click(object sender, EventArgs e) 15 { 16 var processInfo = new ProcessStartInfo(@"...\caller.exe"); 17 processInfo.RedirectStandardOutput = true; 18 processInfo.UseShellExecute = false; 19 var process = new Process(); 20 process.StartInfo = processInfo; 21 process.Start(); 22 textBox1.Text = process.StandardOutput.ReadLine(); 23 } 24 } 25}
以上で、一番下のアプリのテキストボックスに文字が入ることを確認しました。
投稿2016/07/26 13:26
編集2016/07/26 23:22総合スコア28660
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/07/26 13:52
2016/07/26 13:55
2016/07/26 22:34
2016/07/26 23:22
2016/07/27 02:38
2016/07/27 13:36