我的c ++头文件中有这些

#ifndef S2dll_H
#define S2dll_H

#ifdef S2dll_EXPORTS
#define S2dll_API __declspec(dllexport)

#else
    #pragma message("automatic link to S2dll.LIB")
    #pragma comment(lib, "S2dll.lib")
#define S2dll_API __declspec(dllimport)
#endif


类被这样声明

class S2dll_API Sample
{
//members here
}


包含函数定义,构造函数的cpp文件

void * __stdcall CreateS() //constructor
{
    return new SDLL;
}


void __stdcall DestroyS(void * objPtr) //destructor
{
   s* sObj = (s *) objPtr;
    if (sobj)
        delete sObj;
}


导出/公开此功能

void __stdcall setvaluesDLL(void *ptr, int x, int y,int s, int p)
    {


        Sample *dll =  (Sample *) ptr;

        if (dll)
        {
            dll->setposition(c); //functions in the cpp file
            dll->setlocation(x,y);
            dll->setsize(s);
        }

    }


.def文件

LIBRARY BS2dll

EXPORTS
CreateS
DestroyS
setvaluesDLL


所以我想以我的C#Win形式访问它

使它暴露出来

static internal  class dllcall
{
[DllImport(@"adrress\S2dll.dll", CallingConvention = CallingConvention.StdCall)]
    public static extern void setvaluesDLL(IntPtr ptr,int x, int y, int s, int p);
}


在我的winform中调用它

private void Assign_Click(object sender, EventArgs e)
{
dllcall.setvaluesDLL(ptr, x, y, s, p);//all values are int
 }


我收到此错误:
尝试读取或写入受保护的内存。这通常表明其他内存已损坏。

一直在搜索google并盯着这个代码几个小时,每当我设法解决问题时,每当我致电setvaluesDLL(//parameters)时,都会出现一个新代码

编辑:
IntPtr ptr是我这里的主要问题,我完全不知道如何使用或初始化它

最佳答案

您必须使用CreateS()结果初始化第一个setvaluesDLL参数值。此方法也应从dll导入。与DestroyS相同-正确释放内存

关于c# - 将C++ DLL导出到C#Winform,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20683295/

10-15 06:09