Conor Watson
Conor Watson

Reputation: 617

PInvoke Access Violation with StringBuilder

I am currently testing some PInvoke stuff and wrote a short C function to try some different things out. I successfully managed to pass Ints and return an addition, but I am having some trouble when it comes to strings.

Here is the C function:

__declspec(dllexport) int test(char *str, int slen){
    for(int i = 0; i < slen; i++){
        str[i] = 'a';
    }
    return slen;
}

And here is the C# function declaration and usage:

[DllImport("solver.dll", CharSet = CharSet.Ansi ,CallingConvention = CallingConvention.Cdecl)]
public static extern int test(StringBuilder sol, int len);

StringBuilder sol = new StringBuilder(15);
int ret = test(sol, sol.Capacity);
string str = sol.ToString();

I've been researching this for most of the day and I've seen several posts about simply passing a StringBuilder, filling it on the C end and it should be accessible when the function finishes. However I am currently getting an AccessViolation error in the C code as if the Memory hadn't been allocated, but I definitely allocate the Memory with new StringBuilder(15)

The C function definitely works if I allocate a piece of memory in the C code and pass it. Is there something I am missing?

Upvotes: 2

Views: 540

Answers (1)

Mr.C64
Mr.C64

Reputation: 43044

Sounds like you are missing to NUL-terminate the string buffer.

You may want to update your code like this:

for (int i = 0; i < (slen-1); i++) {
    str[i] = 'a';
}
str[slen-1] = '\0'; // Add a NUL-terminator

Note that in this case I'm assuming the buffer length passed by the caller is the total length, including room for the NUL-terminator.

(Other conventions are possible as well, for example assuming the length passed by the caller excludes the NUL-terminator; the important thing is clarity of the interface documentation.)

I'd also like to add that a usual calling convention for those exported functions is __stdcall instead of __cdecl (although that's not correlated to your problem).

Upvotes: 1

Related Questions