質問編集履歴

8

コメントを追加しました。

2021/02/23 02:19

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -102,7 +102,7 @@
102
102
 
103
103
  memcpy_s(lpString, bufSize, string, bufSize);
104
104
 
105
- lpString[bufSize] = 0;
105
+ lpString[bufSize] = 0;// 強制的に切ってNULL終端文字列として返す。
106
106
 
107
107
  return 0;
108
108
 

7

ソースコードを修正しました。

2021/02/23 02:19

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -89,8 +89,6 @@
89
89
  if (bufSize > _countof(string))
90
90
 
91
91
  {
92
-
93
-
94
92
 
95
93
  strcpy_s(lpString, _countof(string), string);
96
94
 

6

ソースコードを修正しました。

2021/02/23 02:11

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -72,9 +72,9 @@
72
72
 
73
73
  #include "pch.h"
74
74
 
75
- #include <string.h> // for strcpy_s
75
+ #include <string.h> // for strcpy_s
76
76
 
77
- #include <stdlib.h> // for _countof
77
+ #include <stdlib.h> // for _countof
78
78
 
79
79
  #include "GetString.h"
80
80
 

5

ソースコードを修正しました。

2021/02/23 02:08

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -58,6 +58,8 @@
58
58
 
59
59
  GetString
60
60
 
61
+
62
+
61
63
  // .h
62
64
 
63
65
  #pragma once
@@ -70,7 +72,7 @@
70
72
 
71
73
  #include "pch.h"
72
74
 
73
- #include <string.h> // for strcpy_s
75
+ #include <string.h> // for strcpy_s
74
76
 
75
77
  #include <stdlib.h> // for _countof
76
78
 
@@ -88,6 +90,8 @@
88
90
 
89
91
  {
90
92
 
93
+
94
+
91
95
  strcpy_s(lpString, _countof(string), string);
92
96
 
93
97
  return 1;
@@ -97,6 +101,10 @@
97
101
  else
98
102
 
99
103
  {
104
+
105
+ memcpy_s(lpString, bufSize, string, bufSize);
106
+
107
+ lpString[bufSize] = 0;
100
108
 
101
109
  return 0;
102
110
 
@@ -126,7 +134,7 @@
126
134
 
127
135
  {
128
136
 
129
- const int BUF_SIZE = 1024;
137
+ const int BUF_SIZE = 3;
130
138
 
131
139
 
132
140
 
@@ -166,7 +174,11 @@
166
174
 
167
175
  {
168
176
 
177
+ string msg = Marshal.PtrToStringAnsi(lpString);
178
+
169
- MessageBox.Show("文字列が長すぎます。");
179
+ MessageBox.Show("文字列が長すぎます。途中で切りました。"
180
+
181
+ + Environment.NewLine + "長い文字列は「" + msg + "」になってしまいました。");
170
182
 
171
183
  }
172
184
 

4

Tabを一つ消しました。

2021/02/23 02:06

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -70,7 +70,7 @@
70
70
 
71
71
  #include "pch.h"
72
72
 
73
- #include <string.h> // for strcpy_s
73
+ #include <string.h> // for strcpy_s
74
74
 
75
75
  #include <stdlib.h> // for _countof
76
76
 

3

ソースコードを修正しました。

2021/02/23 01:52

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -156,9 +156,9 @@
156
156
 
157
157
  {
158
158
 
159
- string longString = Marshal.PtrToStringAnsi(lpString);
159
+ string msg = Marshal.PtrToStringAnsi(lpString);
160
160
 
161
- MessageBox.Show("長い文字列は「" + longString + "」です。");
161
+ MessageBox.Show("長い文字列は「" + msg + "」です。");
162
162
 
163
163
  }
164
164
 

2

ソースコードを修正しました。

2021/02/23 01:47

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -88,8 +88,6 @@
88
88
 
89
89
  {
90
90
 
91
-
92
-
93
91
  strcpy_s(lpString, _countof(string), string);
94
92
 
95
93
  return 1;
@@ -158,7 +156,9 @@
158
156
 
159
157
  {
160
158
 
159
+ string longString = Marshal.PtrToStringAnsi(lpString);
160
+
161
- MessageBox.Show("長い文字列は「" + Marshal.PtrToStringAnsi(lpString) + "」です。");
161
+ MessageBox.Show("長い文字列は「" + longString + "」です。");
162
162
 
163
163
  }
164
164
 

1

修正版ソースコード記載

2021/02/23 01:45

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -39,3 +39,149 @@
39
39
 
40
40
 
41
41
  ↑これであってますか?
42
+
43
+
44
+
45
+ 作り直しました。
46
+
47
+ ↓これであってますか?
48
+
49
+ ```C++
50
+
51
+ // .def
52
+
53
+ LIBRARY
54
+
55
+ "GetString"
56
+
57
+ EXPORTS
58
+
59
+ GetString
60
+
61
+ // .h
62
+
63
+ #pragma once
64
+
65
+ extern "C" __declspec(dllexport) int __stdcall GetString(char* lpString, int bufSize);
66
+
67
+
68
+
69
+ // .cpp
70
+
71
+ #include "pch.h"
72
+
73
+ #include <string.h> // for strcpy_s
74
+
75
+ #include <stdlib.h> // for _countof
76
+
77
+ #include "GetString.h"
78
+
79
+
80
+
81
+ extern "C" __declspec(dllexport) int __stdcall GetString(char* lpString, int bufSize)
82
+
83
+ {
84
+
85
+ char string[] = { "長い文字列" };
86
+
87
+ if (bufSize > _countof(string))
88
+
89
+ {
90
+
91
+
92
+
93
+ strcpy_s(lpString, _countof(string), string);
94
+
95
+ return 1;
96
+
97
+ }
98
+
99
+ else
100
+
101
+ {
102
+
103
+ return 0;
104
+
105
+ }
106
+
107
+ }
108
+
109
+ ```
110
+
111
+
112
+
113
+ ```C#
114
+
115
+ using System;
116
+
117
+ using System.Runtime.InteropServices;
118
+
119
+ using System.Windows.Forms;
120
+
121
+
122
+
123
+ namespace ShowString
124
+
125
+ {
126
+
127
+ public partial class Form1 : Form
128
+
129
+ {
130
+
131
+ const int BUF_SIZE = 1024;
132
+
133
+
134
+
135
+ public Form1()
136
+
137
+ {
138
+
139
+ InitializeComponent();
140
+
141
+ }
142
+
143
+
144
+
145
+ [DllImport("GetString.dll", CallingConvention = CallingConvention.StdCall)]
146
+
147
+ private static extern int GetString(IntPtr lpString, int bufSize);
148
+
149
+
150
+
151
+ private void button1_Click(object sender, EventArgs e)
152
+
153
+ {
154
+
155
+ IntPtr lpString = Marshal.AllocHGlobal(BUF_SIZE);
156
+
157
+ if (GetString(lpString, BUF_SIZE) == 1)
158
+
159
+ {
160
+
161
+ MessageBox.Show("長い文字列は「" + Marshal.PtrToStringAnsi(lpString) + "」です。");
162
+
163
+ }
164
+
165
+ else
166
+
167
+ {
168
+
169
+ MessageBox.Show("文字列が長すぎます。");
170
+
171
+ }
172
+
173
+ Marshal.FreeHGlobal(lpString);
174
+
175
+ }
176
+
177
+ }
178
+
179
+ }
180
+
181
+ ```
182
+
183
+
184
+
185
+ ↓こんな警告が出ます。無視していいですか?
186
+
187
+ warning LNK4017: "GetString" ステートメントはターゲット プラットフォームでサポートされていません。無視しました。