zai zai ty bon
zai zai ty bon

Reputation: 145

Attempted to read or write protected memory with dllimport in c#

I have a problem with my project: In dll c++:

    extern "C" __declspec(dllexport) int results(char* imgInput, void* tree)
{   
    struct kd_node* nodeTree = new(tree)kd_node ; // new kd_tree with data from memory address
    ...

    ...
    int ret = atoi(retValueStr.c_str());
    return ret;
}

extern "C" __declspec(dllexport) void* buildKDTree(char* folder)
{
    struct kd_node* kd_root;
    ....

    feature *LFData = listFeat.data();
    kd_root = kdtree_build(LFData,listFeat.size());
    void* address_kdtree = (void*)&kd_root; // get memory address of kd_tree
    return address_kdtree;
}

and I use to dllimport in c#:

[DllImport(@"kdtreeWithsift.dll", EntryPoint = "buildKDTree", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public unsafe static extern void* buildKDTree(byte[] urlImage);


[DllImport(@"kdtreeWithsift.dll", EntryPoint = "results", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
[return:MarshalAs(UnmanagedType.I4)]
public unsafe static extern int results(byte[] imgInput, void* tree);

static unsafe void Main()
{
     string urlImg1 = "C:/Users../test img/1202001T1.jpg";
     string urlImg = "C:/export_features"; 

     try
     {  
     IntPtr result;
     int result1;
     result1 = results(convertStringToByte(urlImg1), 5, buildKDTree(convertStringToByte(urlImg))); //  this error
     Console.WriteLine("results = %d",result1);
     }
     catch (Exception ex)
     {
          Console.WriteLine(ex);
          Console.ReadLine();
     }
}

when i run the program, this program show error : Attempted to read or write protected memory. This is often an indication that other memory is corrupt

what error do you know and how to resolved ? thank you!

Upvotes: 3

Views: 5197

Answers (4)

lestival
lestival

Reputation: 71

I think its similar problem due to char* parameters, in my own problem thanks to this below link question solves the problem.

So your only solution is to pass the string parameters as IntPtr. Allocate the memory with Marshal.StringToHGlobalAnsi

Attempted to read or write protected memory with dllimport in c#

Upvotes: 0

drictori
drictori

Reputation: 1

I try to call it :

IntPtr tree = buildKDTree(urlImg);
int result1 = results(urlImg, 50, tree);

Console.WriteLine("results = {0}",result1);

but it is not your fault where you said. I think the variable intPtr tree in function results([MarshalAs(UnmanagedType.LPStr)]string imgInput, IntPtr tree); that caused the error

Upvotes: 0

Jim Mischel
Jim Mischel

Reputation: 133985

You don't need a convertStringToByte method here. You can tell the runtime to marshal your string as a char *. Also, I would suggest that you make the method return an IntPtr, like this:

[DllImport(@"kdtreeWithsift.dll", EntryPoint = "buildKDTree",
    CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr buildKDTree([MarshalAs(UnmanagedType.LPStr)]string urlImage);

[DllImport(@"kdtreeWithsift.dll", EntryPoint = "results",
    CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
[return:MarshalAs(UnmanagedType.I4)]
public static extern int results([MarshalAs(UnmanagedType.LPStr)]string imgInput, IntPtr tree);

You can then call it with:

IntPtr tree = buildKDTree(urlImg);
int result1 = results(urlImg, 50, tree);

Console.WriteLine("results = {0}",result1);

Upvotes: 1

The other other Alan
The other other Alan

Reputation: 1908

Well, for one thing, the C function is called buildKDTree, but you are importing it in the C# code with entry point "buildKDTreeWithFeatures". Try making these consistent and see if you get better results.

Upvotes: 0

Related Questions