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

回答編集履歴

2

DLL環境を追記

2017/03/30 04:40

投稿

8524ba23
8524ba23

スコア38352

answer CHANGED
@@ -1,4 +1,4 @@
1
- 以下の修正で、こちらの環境(Win10x64, python=3.5.2, DLL=64bitANSIビルド)では正しく動作しました。
1
+ 以下の修正で、こちらの環境(Win10x64, python=3.5.2, DLL=VS2010にて64bitANSIビルド)では正しく動作しました。
2
2
  - `class`ではなく`object`を得る
3
3
  - `cast`する
4
4
  ```Python

1

DLL例を追記

2017/03/30 04:40

投稿

8524ba23
8524ba23

スコア38352

answer CHANGED
@@ -2,6 +2,12 @@
2
2
  - `class`ではなく`object`を得る
3
3
  - `cast`する
4
4
  ```Python
5
+ userdll = windll.LoadLibrary('MyDLL.dll')
6
+ userdll.Sum.restype = c_int
7
+ userdll.Sum.argtypes = [POINTER(c_int), (c_int)]
8
+
9
+ length = c_int(16)
10
+
5
11
  #buffer = c_int * 16
6
12
  #buffer = <class '__main__.c_long_Array_16'>
7
13
  #p_buffer = POINTER(buffer)
@@ -11,5 +17,34 @@
11
17
  #buffr = <__main__.c_long_Array_16 object at 0x0000016931FBC1C8>
12
18
  p_buffer = cast(buffer, POINTER(c_int))
13
19
  #p_buffer = <__main__.LP_c_long object at 0x0000016931FBC248>
20
+
21
+ result = userdll.Sum( p_buffer, length)
22
+ print(result)
14
23
  ```
24
+
25
+ MyDLL.h
26
+ ```C++
27
+ #ifdef MYDLL_EXPORTS
28
+ #define MYDLL_API __declspec(dllexport)
29
+ #else
30
+ #define MYDLL_API __declspec(dllimport)
31
+ #endif
32
+ MYDLL_API int WINAPI Sum( int *pn, int count);
33
+ ```
34
+
35
+ MyDLL.cpp
36
+ ```C++
37
+ #define MYDLL_EXPORTS
38
+ #include "MyDLL.h"
39
+ MYDLL_API int WINAPI Sum( int *pn, int count)
40
+ {
41
+ int ret = 0;
42
+ for( int i = 0; i < count; i++){
43
+ pn[i] = i+1;
44
+ ret += pn[i];
45
+ }
46
+ return ret;
47
+ }
48
+ ```
49
+
15
50
  参考:[Mutate an integer array using ctypes](http://stackoverflow.com/questions/1325518/mutate-an-integer-array-using-ctypes)