蔡小菜的快乐生活 2019-11-21 11:11 采纳率: 0%
浏览 594

使用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条回答

  • zqbnqsdsmd 2019-11-21 11:23
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)