当前位置:编程学习 > C#/ASP.NET >>

C#调用VC的DLL CallBack函数问题,CallBack函数返回数据有问题

VC实现一个DLL,其中一个导出方法接受一个函数指针,实现Callbak功能,
下面是DLL的导出函数。

typedef void (WINAPI *fnCallBack)(LPCTSTR ptr);

extern "C" __declspec(dllexport) void ShowMsg(fnCallBack t)
{
return t(_T("abcdef"));
}

C#中采用delegate实现回调函数的定义,如下

    public delegate void OnMsgDlg(string str);

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

        private void button1_Click(object sender, EventArgs e)
        {
            OnMsgDlg omd = new OnMsgDlg(Form1.OnMsg);
            ShowMsg(omd);
        }

        [DllImport("DllProject.dll")]
        public static extern void ShowMsg(OnMsgDlg fnCallback);

        public static void OnMsg(string str)
        {
            MessageBox.Show(str);
        }
    }

运行结果错误,本应现实"abcdef",结果只显示一个"a",请问原因是什么?
--------------------编程问答-------------------- 注意函数参数定一个字符串编码c++要与c#一致 --------------------编程问答-------------------- 终于在C#版遇到能解决的问题了。呵呵。
C#的string是2字节编码的(具体是BSTR还是Unicode就不知了),所以在你的VC中要用Unicode编译,或return t(_L("abcdef")); --------------------编程问答-------------------- 我已经用了Unicode编译,但错误依旧。 --------------------编程问答-------------------- 怪异,改为
t(SysAllocString((BSTR)"abcdef"));
就可以了,谁能解释一下原因,并且这种方式是否会有内存泄漏? --------------------编程问答-------------------- 仍然采用这种方式。
typedef void (WINAPI *fnCallBack)(LPCTSTR ptr);

extern "C" __declspec(dllexport) void ShowMsg(fnCallBack t)
{
return t(_T("abcdef"));
}

如果采用_MBCS编译,则无论dllimport的charset属性是什么,结果都正确。
如果采用_UNICODE,UNICODE编译,无论dllimport的charset属性是什么,结果都不正确。
好像callback的时候,charset的属性就不起作用。
--------------------编程问答--------------------
public delegate void OnMsgDlg([MarshalAs(UnmanagedType.LPTStr)] string str);

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

    private void button1_Click(object sender, EventArgs e)
    {
        OnMsgDlg omd = new OnMsgDlg(Form1.OnMsg);
        ShowMsg(omd);
    }

    [DllImport("DllProject.dll ")]
    public static extern void ShowMsg(OnMsgDlg fnCallback);

    public static void OnMsg([MarshalAs(UnmanagedType.LPTStr)] string str)
    {
        MessageBox.Show(str);
    }
}
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,