3

Python(2.7)にインポートできるDLLを作成しようとしていますが、「動作させる」のに問題があります。WinDLL()またはを使用してPythonでライブラリをロードしwindll.LoadLibrary()、エクスポートされた関数をテストすると、取得する出力は空になります。それに引数を追加すると、おそらく多くの引数があるTestFunction()ことを示すaが発生ValueErrorします(実際にはそうではありません)。

python-ファイル:

from ctypes import *

x = windll.LoadLibrary('./pymod.dll')
print x.TestFunction(123) #Should return 123.

main.h:

#ifndef __MAIN_H__
#define __MAIN_H__
#include <windows.h>
#define DLL_EXPORT __declspec(dllexport)    

#ifdef __cplusplus
extern "C"
{
#endif

int DLL_EXPORT TestFunction(int data);

#ifdef __cplusplus
}
#endif

#endif

およびmain.cpp:

#include "main.h"

int DLL_EXPORT TestFunction(int x = 0) {
    return x;
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
    switch (fdwReason){
        case DLL_PROCESS_ATTACH:
            break;
        case DLL_PROCESS_DETACH:
            break;
        case DLL_THREAD_ATTACH:
            break;
        case DLL_THREAD_DETACH:
            break;
    }
    return TRUE;
}

解決済み:問題は呼び出し規約が間違っていました。

4

1 に答える 1

6

私の最初の推測では、Pythonが想定しているものとは異なる呼び出し規約を使用していると思います。

int DLL_EXPORT TestFunction(int data);

その宣言は、おそらくcdecl呼び出し規約が使用されることを意味します。を使用すると、Pythonは規則を使用する必要があるwindllと信じます。stdcallこれにより、引数の受け渡し方法が効果的に変更されるため、Pythonは、間違った数の引数を渡したと見なします。これは、ctypesのドキュメントに記載されています。

その場合は、次のいずれかを実行できます。

  1. Cコードの呼び出し規約をstdcall(WindowsシステムDLLで使用される)に変更します。MSVCを使用している場合は、DLLの開発に関するドキュメントがあります
  2. Pythonコードで期待される呼び出し規約をに変更しcdeclます。これは、cdllの代わりにを使用して行われwindllます。
于 2012-08-02T02:34:11.420 に答える