c#动态调用c++编写的DLL函数----求教

时间:2023-01-24 19:00:44
调用一个金橙子提供的(MarkEzd.dll)动态链接库。我将该dll文件分别置于..\bin与..\bin\Debug目录下,调试均失败。

我编写的代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;


namespace Code01
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }


        ///函数名:lmcl_Initial
        ///目的:初始化lmcl控制卡
        ///语法int lmcl_Intitial(TCHAR* strEzCadPath,BOOL bTestMode,HWND hOwenWnd);
        ///strEzCadPath:是ezcad.exe所在的目录的全路径名称
        ///bTestMode:指是否测试模式
        ///hOwenWnd:指用户输入焦点的窗口,用于检测用户暂停消息
        ///描述:在程序中必须首先调用lmc_Initial,其他函数才能工作
        ///返回值:通用错误代码
        [DllImport("MarkEzd.dll",EntryPoint="lmcl_Initial",CharSet=CharSet.Auto,CallingConvention =CallingConvention.StdCall)]
        public static extern int lmcl_Initial(ref string  strEzCadPath,bool bTestMode,string hOwenWnd);



        ///函数名:lmcl_Close
        ///目的:关闭lmcl控制卡
        ///语法:int lmcl_Close();
        ///描述:在程序中退出时必须调用lmcl_Close来关闭lmcl控制卡
        ///返回值:通用错误代码
        [DllImport("MarkEzd.dll", EntryPoint = "lmcl_Close", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern int lmcl_Close();


        ///函数名:lmcl_LoadEzdFile
        ///目的:打开指定的ezd文件,并清除当前数据库中的所有对象
        ///语法int lmcl_LoadEzdFile(TCHAR* strFileName);
        ///描述:在程序中一般用此函数来打开一个用户建立ezd模板文件,这样用户就不需要在程序中设置加工参数,因为模板中的加工参数会自动导入
        ///返回值:通用错误代码
        [DllImport("MarkEzd.dll", EntryPoint = "lmcl_LoadEzdFile", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern int lmcl_LoadEzdFile(ref string  strFileName);


        ///函数名:lmcl_Mark
        ///目的:标刻当前数据库里的所有数据
        ///语法:int lmcl_Mark(BOOL bFlyMark);
        ///bFlyMark=True 使能飞动打标
        ///描述:在使用lmcl_LoadEzdFile载入ezd文件后即可以使用此函数开始打标加工,此函数一直等待设备加工完毕后才返回
        ///返回值:通用错误代码
        [DllImport("MarkEzd.dll", EntryPoint = "lmcl_Mark", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern int lmcl_Mark(bool bFlyMark);


        ///函数名:lmcl_ChangeTextByName
        ///目的:更改指定名称的文本对象的文本内容
        ///语法:int lmcl_ChangeTextByName(tchar* strTextName,TCHAR* strTextNew);
        ///strTextName:要更改内容的文本对象的名称
        ///strTextNew:新的文本内容
        ///描述:在使用lmcl_LoadEzdFile载入ezd文件后,在每次加工前即可以使用此函数更改指定对象的内容
        ///返回值:通用错误代码
        [DllImport("MarkEzd.dll", EntryPoint = "lmcl_ChangeTextByName", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern int lmcl_ChangeTextByName(ref  string strTextName, ref  string strTextNew);


        private void Form1_Load(object sender, EventArgs e)
        {
            textBox1.Text = "";//清空文本框
        }


        private void button1_Click(object sender, EventArgs e)
        {
            int dwErrCde;//初始化成功或错误
            string _strEzCadPath="C:\\EzCad2.1.3_UNICODE(20090912)\\EzCad2.exe";//存储ezcad.exe所在的目录的全路径名称
            bool  _bTestMode=false ;//是否为测试模式
            string _hOwenWnd="";//用户输入焦点的窗口,用于检测用户暂停消息
            string _strFileName = "27701202";//指定的ezd模板文件
            bool _bFlyMark = true;//使能飞动打标
            string _strTextName = "2770120";//要更改内容的文本对象的名称
            string _strTextNew = "ABCDE02123456789";//新的文本内容

                dwErrCde = lmcl_Initial(ref _strEzCadPath, _bTestMode, _hOwenWnd);//设备初始化

                if (dwErrCde == 0)
                {

                    lmcl_LoadEzdFile(ref _strFileName);//加载打印模板

                    lmcl_ChangeTextByName(ref _strTextName, ref _strTextNew);//填充模板的文本内容

                    lmcl_Mark(_bFlyMark);//使能飞动打标
                }
           
                lmcl_Close();
            

        }

    }
}


调试时,语句“ dwErrCde = lmcl_Initial(ref _strEzCadPath, _bTestMode, _hOwenWnd);”报错,报错信息为“无法加载 DLL“MarkEzd.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。”。

我怀疑是"_hOwenWnd"赋值有误,可惜不知道此处该使用何种方式。文中可能还有其他错误,请大家帮忙。

10 个解决方案

#1


无法加载时找不到,MarkEzd.dll这个dll 或者与这个dll关联的其他文件。

#2


确定只有这一个库么?是不是还有一个辅助库?
无法加载就是找不到无法识别

#3


只有这一个库,不涉及到其它的。。。

我是c#新手,刚自学了2个月的时间。
这个程序段的主要设计思路是:
通过C# 动态连接c++函数库,实现打标机的初始化、设定打标内容、打标、关闭打标机这一系列动作。

我总感觉是赋值的格式与内容不正确,仔细琢磨了三天,还是发现不了问题,很苦恼。

#4


把项目的输出目录定位到ezcad目录下,因为MarkEzd.dll还引用了其他的dll

#5


引用 4 楼 boby2007 的回复:
把项目的输出目录定位到ezcad目录下,因为MarkEzd.dll还引用了其他的dll

楼上正解,或者把EzCard目录下的文件拷贝到项目所在目录下即可。
不知道拷哪个干脆全部拷过去,把你认识没用的删掉就行了。

#6


楼主可以qq交流么,549086692.

#7


64位还是32位?

#8


用depends看下该dll用到其他哪些dll.

#9


你好,看到你也搞金橙子二次开发,我现在遇到的问题是初始化函数调用会报参数类型错误,请问会是哪里出了问题,我的QQ 2170913,可以请教一下吗?谢谢。

#10


[DllImport("MarkEzd.dll")]
        public static extern int lmcl_Initial(string  strEzCadPath,bool bTestMode,int hOwenWnd);

#1


无法加载时找不到,MarkEzd.dll这个dll 或者与这个dll关联的其他文件。

#2


确定只有这一个库么?是不是还有一个辅助库?
无法加载就是找不到无法识别

#3


只有这一个库,不涉及到其它的。。。

我是c#新手,刚自学了2个月的时间。
这个程序段的主要设计思路是:
通过C# 动态连接c++函数库,实现打标机的初始化、设定打标内容、打标、关闭打标机这一系列动作。

我总感觉是赋值的格式与内容不正确,仔细琢磨了三天,还是发现不了问题,很苦恼。

#4


把项目的输出目录定位到ezcad目录下,因为MarkEzd.dll还引用了其他的dll

#5


引用 4 楼 boby2007 的回复:
把项目的输出目录定位到ezcad目录下,因为MarkEzd.dll还引用了其他的dll

楼上正解,或者把EzCard目录下的文件拷贝到项目所在目录下即可。
不知道拷哪个干脆全部拷过去,把你认识没用的删掉就行了。

#6


楼主可以qq交流么,549086692.

#7


64位还是32位?

#8


用depends看下该dll用到其他哪些dll.

#9


你好,看到你也搞金橙子二次开发,我现在遇到的问题是初始化函数调用会报参数类型错误,请问会是哪里出了问题,我的QQ 2170913,可以请教一下吗?谢谢。

#10


[DllImport("MarkEzd.dll")]
        public static extern int lmcl_Initial(string  strEzCadPath,bool bTestMode,int hOwenWnd);