首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >封送字符数组函数参数的最佳方法是什么?

封送字符数组函数参数的最佳方法是什么?
EN

Stack Overflow用户
提问于 2010-04-02 12:35:26
回答 1查看 682关注 0票数 0

假设给定LegacyLib.dll中的以下签名:

代码语言:javascript
复制
int Login(SysInst *inst, char username[8], char password[6]);

在C#中封送此函数的简单方法是:

代码语言:javascript
复制
[DllImport("LegacyLib.dll", CharSet=CharSet.Ansi)]
public static extern int Login(ref SysInst inst, string username, string password);

这样做的问题是,我们传递给usernamepassword参数的托管字符串可能比数组边界更长,这可能会导致LegacyLib.dll中的缓冲区溢出。

有没有更好的方法来克服这个问题?也就是说,有没有什么快速的[MarshalAs(…)]魔法可以用来解决这个问题呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-04-02 18:53:27

我目前解决这个问题的方法如下:

代码语言:javascript
复制
public class LegacyLibWrapper {
    // Don't expose the function...
    [DllImport("LegacyLib.dll", EntryPoint = "Login", CharSet = CharSet.Ansi)]
    static extern int UnmanagedLogin (ref SysInst inst, string username, string password);

    // ... we write a proxy function that does the truncation to passed to LegacyLib
    public static int Login(ref SysInst inst, string username, string password)
    {
        return UnmanagedLogin(inst, Truncate(username, 7), Truncate(password, 5));
    }

    // A utility function to do string truncation
    private function Truncate(string originalString, int maxLength)
    {
        if (originalString.Length < maxLength)
        {
            return originalString;
        }
        else
        {
            return originalString.Substring(0, maxLength);
        }
    }
}

..。老实说,不得不写额外的代码来解决这个问题,我觉得有点拖累,我想知道有没有更好的方法来实现它?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2565020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档