从d运行函数时发生访问冲突

2024-05-12 17:26:17 发布

您现在位置:Python中文网/ 问答频道 /正文

<>我有DLL,C++接口,用于和他一起工作。在bcb,msvc,它工作得很好。我想使用Python脚本来访问这个库中的函数。 使用Swig生成python包。在

文件设置.py

 import distutils
 from distutils.core import setup, Extension

 setup(name = "DCM",
     version = "1.3.2",
     ext_modules = [Extension("_dcm", ["dcm.i"], swig_opts=["-c++","-D__stdcall"])],
     y_modules = ['dcm'])

文件dcm.i

^{pr2}$

运行以下命令(python与extension.py关联)

setup build
setup install

使用此DLL

import dcm

f = dcm.Factory() #ok

r = f.getRegistrationMessage() #ok
print "r.GetLength() ", r.GetLength() #ok
r.SetLength(0) #access violation

在最后一个字符串上我得到了访问冲突。我对每个使用输入参数的函数都有访问冲突。在

DcmInterface.h(接口)

class IRegistrationMessage
{
public:
...
    virtual int GetLength() const = 0;
    virtual void SetLength(int value) = 0;
...
};

注册信息.cpp(在DLL中实现)

class TRegistrationMessage : public IRegistrationMessage
{
public:
...
virtual int GetLength() const
    {
        return FLength;
    }
    virtual void SetLength(int Value)
    {
        FLength = Value;
        FLengthExists = true;
    }
...
};

工厂

DcmFactory.h(在客户端代码中使用DLL)

class Factory
{
private:
    GetRegistrationMessageFnc GetRegistration;

bool loadLibrary(const char *dllFileName = "dcmDLL.dll" )
    {
    ...
        hDLL = LoadLibrary(dllFileName);
        if (!hDLL) return false;
        ...
        GetRegistration = (GetRegistrationMessageFnc) GetProcAddress( hDLL, "getRegistration" );
        ...
    }
public:
Factory(const char* dllFileName = "dcmDLL.dll")
{
    loadLibrary(dllFileName);
}

IRegistrationMessage* getRegistrationMessage()
    {
        if(!GetRegistration) return 0;
        return GetRegistration();
    };
};

Tags: importreturnfactorysetupvirtualokpublicint
1条回答
网友
1楼 · 发布于 2024-05-12 17:26:17

我找到了虫子。 如果使用DLL,则必须以如下显式形式编写调用约定:

class IRegistrationMessage
{
public:
...
    virtual int _cdecl GetLength() const = 0;
    virtual void _cdecl SetLength(int value) = 0;
...
};

我附加了调用约定,现在一切正常。在

相关问题 更多 >