使用VC调用别人用Delphi做的动态库访问冲突且无法加载请问是什么原因呢?

因为最近要做个PC与PLC通信的软件,因此在网上找到一个人用Delphi写的PLC通信dll库,应该是32位。我用VC2015写了个MFC要调用这个dll发现总是提示访问冲突,调用失败。因为有其他人是写图像处理的,环境必须要用VC 2015。但是和那个人联系他说其他人用了是没问题的,我因为是刚开始学这个软件,也没有dll源码,不知道问题出在哪。下面是我程序的源码,其他dll内函数声明我都还没用,只是用LoadlibraryA发现就已经失败了。**如果有朋友能在32位(64位更好)的C++ MFC环境下解决并调试成功的话,必有感谢。**

引用线内部分是我添加的,其他都是向导生成的。附件里面有调用的库。

图片说明
dll地址:h1ttps://pan.baidu.com/s/1chKfBqmRsmDmvfMqt31RNg


// MFC-PLC21Dlg.cpp : 实现文件
//

#include "stdafx.h"
#include "MFC-PLC21.h"
#include "MFC-PLC21Dlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

/////////////////////////////////////////////////////////////////
HINSTANCE hinstDLL;

typedef int(_stdcall *pOpen)(int nport, int BaudRate, int DataBits, char* Parity, int StopBits, char* User);
typedef int(_stdcall *pClose)(int nport);
typedef int(_stdcall *pSetDelay)(int value);
typedef int(_stdcall *pComTrue)(int nport);
typedef int(_stdcall *pComWork)(int nport);

typedef int(_stdcall *pReadBit)(int nport, int node, char* element, int address, int Bit);
typedef int(_stdcall *pReadByte)(int nport, int node, char* element, int address, int Count, int* RxdBuffer);
typedef int(_stdcall *pReadInt)(int nport, int node, char* element, int address, int Count, int* RxdBuffer);
typedef int(_stdcall *pReadDInt)(int nport, int node, char* element, int address, int Count, int* RxdBuffer);
typedef int(_stdcall *pReadFloat)(int nport, int node, char* element, int address, int Count, float* RxdBuffer);

typedef int(_stdcall *pBitWrite)(int nport, int node, char* element, int address, int Bit, int value);
typedef int(_stdcall *pBitEWrite)(int nport, int node, char* element, int address, int Bit, int value);
typedef int(_stdcall *pEbitCancel)(int nport, int node, char* element, int address, int Bit);

typedef int(_stdcall *pWriteByte)(int nport, int node, char* element, int address, int Count, int* TxdBuffer);
typedef int(_stdcall *pWriteInt)(int nport, int node, char* element, int address, int Count, int* TxdBuffer);
typedef int(_stdcall *pWriteDInt)(int nport, int node, char* element, int address, int Count, int* TxdBuffer);
typedef int(_stdcall *pWriteFloat)(int nport, int node, char* element, int address, int Count, float* TxdBuffer);

typedef int(_stdcall *pPlcRun)(int nport, int node);
typedef int(_stdcall *pPlcStop)(int nport, int node);

typedef int(_stdcall *pBitBin)(int value, int Bitaddress);
typedef int(_stdcall *p16I_8h)(int value);
typedef int(_stdcall *p16I_8l)(int value);
typedef int(_stdcall *p8I_16I)(int valueH, int valueL);
typedef int(_stdcall *p32I_16h)(int value);
typedef int(_stdcall *p32I_16l)(int value);
typedef int(_stdcall *p16I_32I)(int valueH, int valueL);
typedef int(_stdcall *p32f_16h)(float value);
typedef int(_stdcall *p32f_16l)(float value);
typedef float(_stdcall *p16I_32f)(int valueH, int valueL);

pOpen mOpen;
pClose mClose;
pSetDelay mSetDelay;
pComTrue mComTrue;
pComWork mComWork;

pReadBit mReadBit;
pReadByte mReadByte;
pReadInt mReadInt;
pReadDInt mReadDInt;
pReadFloat mReadFloat;

pBitWrite mBitWrite;
pBitEWrite mBitEWrite;
pEbitCancel mEbitCancel;

pWriteByte mWriteByte;
pWriteInt mWriteInt;
pWriteDInt mWriteDInt;
pWriteFloat mWriteFloat;

pPlcRun mPlcRun;
pPlcStop mPlcStop;

pBitBin mBitBin;
p16I_8h m16I_8h;
p16I_8l m16I_8l;
p8I_16I m8I_16I;
p32I_16h m32I_16h;
p32I_16l m32I_16l;
p16I_32I m16I_32I;
p32f_16h m32f_16h;
p32f_16l m32f_16l;
p16I_32f m16I_32f;
///////////////////////////////////////////////////////////////

// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

class CAboutDlg : public CDialogEx
{
public:
    CAboutDlg();

// 对话框数据
#ifdef AFX_DESIGN_TIME
    enum { IDD = IDD_ABOUTBOX };
#endif

    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

// 实现
protected:
    DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()


// CMFCPLC21Dlg 对话框



CMFCPLC21Dlg::CMFCPLC21Dlg(CWnd* pParent /*=NULL*/)
    : CDialogEx(IDD_MFCPLC21_DIALOG, pParent)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CMFCPLC21Dlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CMFCPLC21Dlg, CDialogEx)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_BN_CLICKED(Test, &CMFCPLC21Dlg::OnBnClickedTest)
END_MESSAGE_MAP()


// CMFCPLC21Dlg 消息处理程序

BOOL CMFCPLC21Dlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    // 将“关于...”菜单项添加到系统菜单中。

    // IDM_ABOUTBOX 必须在系统命令范围内。
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);

    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
        BOOL bNameValid;
        CString strAboutMenu;
        bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
        ASSERT(bNameValid);
        if (!strAboutMenu.IsEmpty())
        {
            pSysMenu->AppendMenu(MF_SEPARATOR);
            pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
        }
    }

    // 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
    //  执行此操作
    SetIcon(m_hIcon, TRUE);         // 设置大图标
    SetIcon(m_hIcon, FALSE);        // 设置小图标

    // TODO: 在此添加额外的初始化代码



    return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

void CMFCPLC21Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
        CAboutDlg dlgAbout;
        dlgAbout.DoModal();
    }
    else
    {
        CDialogEx::OnSysCommand(nID, lParam);
    }
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CMFCPLC21Dlg::OnPaint()
{
    if (IsIconic())
    {
        CPaintDC dc(this); // 用于绘制的设备上下文

        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

        // 使图标在工作区矩形中居中
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;

        // 绘制图标
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        CDialogEx::OnPaint();
    }
}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CMFCPLC21Dlg::OnQueryDragIcon()
{
    return static_cast<HCURSOR>(m_hIcon);
}


/////////////////////////////////////////////////////////////////////
void CMFCPLC21Dlg::OnBnClickedTest()
{
    // TODO: 在此添加控件通知处理程序代码
    hinstDLL = LoadLibraryA("S7200_PPI.dll");
    if (hinstDLL)
    {
        mOpen = (pOpen)GetProcAddress(hinstDLL, "S7200ComOpen");
        mClose = (pClose)GetProcAddress(hinstDLL, "S7200ComClose");
        mSetDelay = (pSetDelay)GetProcAddress(hinstDLL, "S7200SetDelay");
        mComTrue = (pComTrue)GetProcAddress(hinstDLL, "S7200ComTrue");
        mComWork = (pComWork)GetProcAddress(hinstDLL, "S7200ComWork");

        mReadBit = (pReadBit)GetProcAddress(hinstDLL, "S7200BitRead");
        mReadByte = (pReadByte)GetProcAddress(hinstDLL, "S7200ByteRead");
        mReadInt = (pReadInt)GetProcAddress(hinstDLL, "S7200WordRead");
        mReadDInt = (pReadDInt)GetProcAddress(hinstDLL, "S7200DwordRead");
        mReadFloat = (pReadFloat)GetProcAddress(hinstDLL, "S7200FloatRead");

        mBitWrite = (pBitWrite)GetProcAddress(hinstDLL, "S7200BitWrite");
        mBitEWrite = (pBitEWrite)GetProcAddress(hinstDLL, "S7200BitEWrite");
        mEbitCancel = (pEbitCancel)GetProcAddress(hinstDLL, "S7200EbitCancel");

        mWriteByte = (pWriteByte)GetProcAddress(hinstDLL, "S7200ByteWrite");
        mWriteInt = (pWriteInt)GetProcAddress(hinstDLL, "S7200WordWrite");
        mWriteDInt = (pWriteDInt)GetProcAddress(hinstDLL, "S7200DwordWrite");
        mWriteFloat = (pWriteFloat)GetProcAddress(hinstDLL, "S7200FloatWrite");

        mPlcRun = (pPlcRun)GetProcAddress(hinstDLL, "S7200PlcRun");
        mPlcStop = (pPlcStop)GetProcAddress(hinstDLL, "S7200PlcStop");

        mBitBin = (pBitBin)GetProcAddress(hinstDLL, "DecBitBin");
        m16I_8h = (p16I_8h)GetProcAddress(hinstDLL, "Int16ToInt_8h");
        m16I_8l = (p16I_8l)GetProcAddress(hinstDLL, "Int16ToInt_8l");
        m8I_16I = (p8I_16I)GetProcAddress(hinstDLL, "Int8ToInt16");
        m32I_16h = (p32I_16h)GetProcAddress(hinstDLL, "Int32ToInt_16h");
        m32I_16l = (p32I_16l)GetProcAddress(hinstDLL, "Int32ToInt_16l");
        m16I_32I = (p16I_32I)GetProcAddress(hinstDLL, "Int16ToInt32");
        m32f_16h = (p32f_16h)GetProcAddress(hinstDLL, "Float32ToInt_16h");
        m32f_16l = (p32f_16l)GetProcAddress(hinstDLL, "Float32ToInt_16l");
        m16I_32f = (p16I_32f)GetProcAddress(hinstDLL, "Int16ToFloat32");

        AfxMessageBox(L"S7200_PPI.dll已成功载入!");
    }
    else
    {
        AfxMessageBox(L"没找到S7200_PPI.dll!");
        SendMessage(WM_CLOSE);
    }
}
///////////////////////////////////////////////////////////

1个回答

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问

相似问题

2
用VS2015做一个USBCAN的上位机软件,周立功提供的动态链接库有X64和X86的,那么我怎么知道该调用哪个?
2
vc++能否调用包含工具箱函数(比如:feedforwardnet)的神经网络?
0
我用matlab的load 加载vc编辑框中文件路径指向的txt文件,加载不成功。希望各位帮一下,先谢谢了。
2
VS2008 C# winform 64位程序动态调用VC++ 64位DLL LoadLibrary成功 但是GetProcAddress返回值为0
1
不管是devc++,codeblocks都显示和64位windows不兼容,之前还是好的,突然就这样了。
2
安装OPNET前要配置C环境,但VS2015的VC文件下缺lib文件夹怎么解决
1
WinXP 32位系统运行程序提示“无法定位程序输入点ucrtbase.terminate于动态链接库api-ms-win-crt-runtime-|1-1-0.dll”上,如何解决?
1
求助mfc大佬,vc6.0如何使文本编辑框在窗体中居中?
1
如何创建一个带有指定版本Python和JupyterLab的环境?
1
这是一个关于VC5.4的问题
0
完全分不清楚二级指针哪里用加*哪里不用了 突发奇想写的登录现在改不懂 用的vc6.0写的也没分开。。 还有些别的错误循环创建文件什么的也是刚在网上看的用的不一定对
1
HALCON是如何做到在一个比图片小的窗口中得到图片每个像素的灰度值的?在VC中实现这样的效果吗?
1
[vc]list在做remove时报错
1
关于easyx图形库下载的一点小问题
1
在VC环境下,使用动态链接库编程
1
VS 2019 C++编译遇到MSB319错误
1
为什么这代码在vc或dev上总是会溢出一组莫名奇妙的数据
0
NS2添加队列管理算法遇到的问题?
2
怎么用VC获取如下txt文档里的字符串
1
VC6,为什么添加文件到目录就崩溃?