代码之家  ›  专栏  ›  技术社区  ›  Tom

从C++程序中访问C++ DLL

  •  -1
  • Tom  · 技术社区  · 6 年前

    bool __stdcall __declspec(dllexport) InitHW(char *name, char *model, int& type)
    

    因此,我尝试的代码如下所示,它给出了system.AccessViolation异常:

    [DllImport("extIO_IC7610.dll", CallingConvention = CallingConvention.Cdecl)]
    public unsafe static extern bool InitHW(string name, string model, int type);
    
    private unsafe void Initialize()
    {
        try
        {
            bool result;
    
            string name = "Test";
            string model = "Model";
            int type = 3;
    
            result = InitHW(name, model, type);
        }
        catch (Exception ex)
        {
    
        }
    }
    

    有人能告诉我我在理解上的错误吗?

    根据评论,我将事情更改为如下:

    [DllImport("extIO_IC7610.dll", CallingConvention = CallingConvention.Cdecl)]
    [return: MarshalAs(UnmanagedType.I1)] 
    public unsafe static extern bool InitHW(string name, string model, ref int type);
    
    unsafe private void Initialize())
    {
    
        try
        {
            bool result;
    
            string name = ""; 
            string model = ""; 
            int type = 3;
            result = InitHW(name, model, ref type);
    
        }
        catch (Exception ex)
        {
    
        }
    }
    

    这仍然不起作用。我现在得到一个错误,堆栈是不平衡的,因为签名不匹配。我认为字符串是正确的,但是&int参数可能仍然是一个问题。 汤姆

    1 回复  |  直到 6 年前
        1
  •  0
  •   Tom    6 年前

    我解决了。这里有一些提示,但没有真正正确的。在查看了过去几个小时后,以下是解决方案:

        [DllImport("extIO_IC7610.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
        [return: MarshalAs(UnmanagedType.I1)] 
        public unsafe static extern bool InitHW(StringBuilder name,  StringBuilder model, int* type);
    
    unsafe void Initialize()
    {
               bool result;
    
                int type = 0;
                var name = new StringBuilder(250);
                var model = new StringBuilder(250);
    
                result = InitHW(name, model, &type);
    
                string _name = name.ToString();
                string _model = model.ToString();