外部组件发生异常的一种可能性

作者:小知 发布时间:2017-09-02 分类:C#

   最近笔者在写c#程序的时候,调用了Delphi的动态链接库(dll),C#的调用代码完全正确,主要代码如下:

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 ReadBD2
{
    public partial class Form1 : Form
    {
        #region
        [DllImport("MRIdllS16V4_1_0W.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern void CreateImageWindow22(IntPtr hWnd);
        #endregion
        #region
        [DllImport("User32.dll", EntryPoint = "FindWindow")]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
        #endregion
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            
            IntPtr hWnd = FindWindow(null, "Form1");
            CreateImageWindow22(hWnd);
             
        }
    }
}

    下面的代码声明调用了Delphi的动态库。


[DllImport("MRIdllS16V4_1_0W.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern void CreateImageWindow22(IntPtr hWnd);

    下面的代码声明调用了Win32 API库。


[DllImport("User32.dll", EntryPoint = "FindWindow")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

    form界面唯一的按钮按下的事件是调用Delphi动态链接库里面的一个函数,此函数参数是句柄参数。

private void button1_Click(object sender, EventArgs e)
{
            
     IntPtr hWnd = FindWindow(null, "Form1");
     CreateImageWindow22(hWnd);
             
}

    结果运行起来点击按钮后出现“外部组件发生异常的错误”:

QQ截图20170902083637.png

    百思不得其解,上网查了一圈基本上没有什么可行的解决方案,反复检查发现调用dll的C#代码没有问题,此时大胆敲定是dll出现了问题,但是此dll用Delphi语言调用的时候没有问题,最后发现Delphi编写的dll没有声明为stdcall调用约定,改了一下Delphi的代码:

function CreateImageWindow22TestDll(HWND);stdcall;

    此时发现调用成功。

QQ截图20170902090453.png

本篇完。

呃 本文暂时没人评论 来添加一个吧

发表评论

必填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。