DLL 中的 Python (c++) Visual Studio

Posted

技术标签:

【中文标题】DLL 中的 Python (c++) Visual Studio【英文标题】:Python in DLL (c++) Visual studio 【发布时间】:2014-01-25 23:11:42 【问题描述】:

我有 Visual Studio,我尝试通过 DLL 注入在 GAME 中执行 python。

这是我的代码:

#include "windows.h"
#define MS_NO_COREDLL
#include <Python.h>
#include <detours.h>

#include "stdafx.h"
#include <string>
#include <sstream>
#include <iostream>
#include <fcntl.h>
#pragma comment(lib, "detours.lib")
using namespace std;

void pickupitem()
    PyObject* args = PyTuple_New(0);
    PyObject* ret = PyObject_Call(PyObject_GetAttrString(PyImport_ImportModule("player"), "PickCloseItem"), args, NULL);
    double result = PyFloat_AsDouble(ret);
    Py_DECREF(ret);
    Py_XDECREF(args);
    //return result;

BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)

    switch (ul_reason_for_call)
    
    case DLL_PROCESS_ATTACH:
        pickupitem();
        break;
    case DLL_THREAD_ATTACH:
        break;
    case DLL_THREAD_DETACH:
        break;
    case DLL_PROCESS_DETACH:
        break;
    
    return TRUE;

它编译得很好,但是我的“Winject”(注入 DLL 的程序)出错了,没有说明问题。

当我编辑我的代码并将其更改为:

case DLL_PROCESS_ATTACH:
MessageBoxA(NULL, (LPCSTR) "WORK!", (LPCSTR) "YES !", NULL);
pickupitem();
break; 

我看到了 2x WORK!但 winject 仍然返回错误。

我认为这是 Visual Studio 编译器的错误,你能告诉我怎么了吗?

我已经安装了 python2.7.6 添加文件夹 /libs 到链接器,和 /include 到编译器。

可以调试这个dll,知道问题出在哪里了吗?

最好的问候。

【问题讨论】:

你有什么版本的 Visual Studio?我知道在编写扩展时,用于构建扩展的 VS 版本必须与用于编译 Python 的版本相同。不过,不确定它是否适用于嵌入。 2013版我也下载了VS的python扩展 【参考方案1】:

如何添加对 Py_Initialize() 和 Py_Finalize() 的调用,请参阅 http://docs.python.org/2/c-api/init.html

【讨论】:

注入我的 dll 的程序崩溃;x 我在 python 2.7.6 上运行,在这个游戏目录中我看到“python22.dll”我粘贴在那里 python27.dll 但我知道它包含在游戏中。 (游戏 - metin2 ;p) 有人知道吗?:D 尝试先运行等效的 Python 脚本。
import player ret=player.PickCloseItem() print ret
在 Python API 调用过程中可能会出现一些异常/错误,请尝试将第二行分成三行,并在这些调用之间添加一些异常处理调用。docs.python.org/2/c-api/exceptions.html

以上是关于DLL 中的 Python (c++) Visual Studio的主要内容,如果未能解决你的问题,请参考以下文章

从 python 调试 VS2010 中的 c++ dll

Python 中的 C++ 扩展“DLL 加载失败”

如何以编程方式列出 C++ 或 Python 中的 DLL 依赖项?

如何从 python 访问 C++ dll 中的函数,我只有一个包(一个头文件和一个 dll 文件)

从 python ctypes 中的 c++ dll 传递向量

使用 ctypes 的 .dll 中的 python 中的 C++ 函数 - 未找到函数并且访问冲突