加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 通过DllImport调用非托管函数时损坏的堆

发布时间:2020-12-15 22:06:55 所属栏目:百科 来源:网络整理
导读:我正在使用一个用C#C语言编写的非托管DLL.我有兴趣使用dll中的以下函数: static void StorePath(const std::string path,wchar_t *out_path,int *out_path_length){ wcslcpy(out_path,c_str_w(path),*out_path_length); *out_path_length = path.size(); }
我正在使用一个用C#C语言编写的非托管DLL.我有兴趣使用dll中的以下函数:

static void StorePath(const std::string& path,wchar_t *out_path,int *out_path_length){
      wcslcpy(out_path,c_str_w(path),*out_path_length);
      *out_path_length = path.size();
     }

    int WINAPI BrowseForDirectory(
     int allow_portable,int allow_online,wchar_t *t_directory,int *e_directory_length,wchar_t *m_directory,int *m_directory_length){
     .
     .
     . //initializing new forms and checking product keys

    StorePath(form->SelectedEDirectory().TopDir(),e_directory,e_directory_length);
    StorePath(form->SelectedMDirectory(),m_directory,m_directory_length);
    }

头文件:

#if defined(_WIN32) && !BUILD_WITHOUT_DLLS &&!defined(ECLIPSE_CBUILDER_WORKAROUNDS)
    # if BUILDING_EXPORT_LIBRARY
    #  define EXPORT_DLL __declspec(dllexport)
    # else
    #  define EXPORT_DLL __declspec(dllimport)
    # endif
    #else
    #  define EXPORT_DLL
    #endif

    extern "C" {
        int WINAPI BrowseForDirectory(
         int allow_portable,int *m_directory_length)
    }

然后,我尝试通过执行以下操作在我自己的托管C#类库中调用此函数:

[DllImport("MyDLL.dll",CharSet = CharSet.Ansi)]
    public static extern int BrowseForDirectory(Int32 allowOnline,Int32 allowPortable,[MarshalAs(UnmanagedType.LPStr)] StringBuilder eDirectory,ref Int32 eDirLength,[MarshalAs(UnmanagedType.LPStr)] StringBuilder mDirectory,ref Int32 mDirLength);

最后,我试图通过调用它来在C#应用程序中使用它:

var eDir = new StringBuilder(260);
    var mDir = new StringBuilder(260);
    var eDirLength = eDir.Length;
    var mDirLength = mDir.Length;
    try
    {
        var result = Viewer.BrowseForDirectory(1,1,eDir,ref eDirLength,mDir,ref mDirLength);
    }
    catch(Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }

但是,我收到了堆损坏,但现在我的应用程序因为STATUS_STACK_BUFFER_OVERRUN而退出 – 这是关于嵌入式断点的.更改C代码不是一种选择.我有适当的参考和装配.

我究竟做错了什么?

解决方法

我能看到的问题是你的字符集不匹配.非托管代码将文本返回为UTF-16,但您的p / invoke指定ANSI编码文本.将p / invoke更改为:

[DllImport("MyDLL.dll",CharSet = CharSet.Unicode)]
public static extern int BrowseForDirectory(
    int allowOnline,int allowPortable,StringBuilder eDirectory,ref int eDirLength,StringBuilder mDirectory,ref int mDirLength
);

我假设c_str_w()采用8位编码字符串并返回指向以null结尾的wchar_t数组的指针.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读