質問するログイン新規登録

回答編集履歴

3

追記

2016/07/26 23:22

投稿

Zuishin
Zuishin

スコア28675

answer CHANGED
@@ -11,4 +11,60 @@
11
11
 
12
12
  [DLL内のprintf()による出力を得たい](http://dobon.net/vb/bbs/log3-38/23206.html)は、ご本人かもしれませんが、全く同じ問題ですね。
13
13
 
14
- 該当 dll を読み込む別プロセスを用意して、その Process.StandardOutput をとればできるかもしれませんが、いずれにせよ面倒な手順が必要かもしれません。
14
+ 該当 dll を読み込む別プロセスを用意して、その Process.StandardOutput をとればできるかもしれませんが、いずれにせよ面倒な手順が必要かもしれません。
15
+ ###追記(別プロセスを使った方法)
16
+ 次の C ソースをコンパイルして called.dll を作ります。
17
+ ```C
18
+ __declspec(dllexport) void main(void)
19
+ {
20
+ printf("%s\n", "Hello World!");
21
+ }
22
+ ```
23
+ 次の C# ソースから caller.exe を作ります。
24
+ これは C ソースから作られた dll のメソッドを呼び出すだけのプログラムです。
25
+ このソースからは C の main() を単純に呼び出すことしかできませんが、static void Main(string args[]) としてコマンドライン引数を与えることで他のメソッドにも対応できると思います。
26
+ ```C#
27
+ using System;
28
+ using System.Runtime.InteropServices;
29
+
30
+ static class Program
31
+ {
32
+ [STAThread]
33
+ static void Main()
34
+ {
35
+ main();
36
+ }
37
+
38
+ [DllImport(@"...\called.dll", CallingConvention=CallingConvention.StdCall)]
39
+ static extern void main();
40
+ }
41
+ ```
42
+ 次の C# ソースはアプリ本体です。
43
+ ```C#
44
+ using System;
45
+ using System.Diagnostics;
46
+ using System.Windows.Forms;
47
+
48
+ namespace WindowsFormsApplication1
49
+ {
50
+ public partial class Form1 : Form
51
+ {
52
+ public Form1()
53
+ {
54
+ InitializeComponent();
55
+ }
56
+
57
+ private void button1_Click(object sender, EventArgs e)
58
+ {
59
+ var processInfo = new ProcessStartInfo(@"...\caller.exe");
60
+ processInfo.RedirectStandardOutput = true;
61
+ processInfo.UseShellExecute = false;
62
+ var process = new Process();
63
+ process.StartInfo = processInfo;
64
+ process.Start();
65
+ textBox1.Text = process.StandardOutput.ReadLine();
66
+ }
67
+ }
68
+ }
69
+ ```
70
+ 以上で、一番下のアプリのテキストボックスに文字が入ることを確認しました。

2

修正

2016/07/26 23:22

投稿

Zuishin
Zuishin

スコア28675

answer CHANGED
@@ -7,7 +7,7 @@
7
7
  textBox1.Text = sb.ToString();
8
8
  ```
9
9
  ###追記
10
- 上記でできるだろうと思っていたのですが、実際に確かめてみると無理でした。
10
+ 上記でできるので、printf も可能だろうと思っていたのですが、実際に確かめてみると無理でした。
11
11
 
12
12
  [DLL内のprintf()による出力を得たい](http://dobon.net/vb/bbs/log3-38/23206.html)は、ご本人かもしれませんが、全く同じ問題ですね。
13
13
 

1

追記

2016/07/26 13:48

投稿

Zuishin
Zuishin

スコア28675

answer CHANGED
@@ -5,4 +5,10 @@
5
5
  Console.SetOut(new StringWriter(sb));
6
6
  Console.WriteLine("Hello");
7
7
  textBox1.Text = sb.ToString();
8
- ```
8
+ ```
9
+ ###追記
10
+ 上記でできるだろうと思っていたのですが、実際に確かめてみると無理でした。
11
+
12
+ [DLL内のprintf()による出力を得たい](http://dobon.net/vb/bbs/log3-38/23206.html)は、ご本人かもしれませんが、全く同じ問題ですね。
13
+
14
+ 該当 dll を読み込む別プロセスを用意して、その Process.StandardOutput をとればできるかもしれませんが、いずれにせよ面倒な手順が必要かもしれません。