RGiesecke dll Export template

Howard Taylor picture Howard Taylor · Sep 29, 2014 · Viewed 7.9k times · Source

I have a need to create a dll that can be called from PowerBuilder 12.5. I found the RGiesecke.DllExport page at https://sites.google.com/site/robertgiesecke/Home/uploads#TOC-Samples. I created the following very simple c# project as a console app and in the wizard I selected dll:

VS2013 framework 3.5
Windows 7 

using System;
using System.Collections.Generic;
using System.Text;
using RGiesecke.DllExport;
using System.Runtime.InteropServices;

namespace PRS
{
   internal static class UnmanagedExports
   {
     [DllExport("getsmoochie", CallingConvention = CallingConvention.StdCall)]
     static string GetSmoochie()
     {
         return "Success";
     }
   }
}

I compile in Release mode as 32bit then attempt to access the dll from PowerBuilder with:

Function string GetSmoochie() library "PRS.dll"

I get back what looks like Chinese characters.

In addition I find one thing a little strange: if I try to register the dll with Regsvr32 I get and error telling me there is no dll entry point. I don't know what to think of that.

I have additional dll needs for PowerBuilder but I can't seem to get the simplest thing to work. Any help would be appreciated.

Thank you.

UPDATE:

It occurred to me that getting a mangled string back might not be a problem in this case since the code I really need to execute sends a file to a web service so I implemented the SendFile() code and it works from PowerBuilder.

One change I did make from the code above was to add the keyword "public" to the method call.

Summation: the RGiesecke dll Export template works!

UPDATE: See my note below. Here is my call with the filename passed in:

[DllExport("sendfile", CallingConvention = CallingConvention.StdCall)]
public static long SendFile(String filename)

Since the code with the file name hard-coded works I have to assume the file name is getting mangled somehow and the dll can't fin it.

Any ideas?

Answer

bero picture bero · May 10, 2016

You have to marshal your return value too. This code works for me:

[DllExport("ExpTest", CallingConvention = CallingConvention.Winapi)]
[return: MarshalAs(UnmanagedType.LPWStr)]
public static string ExpTest([MarshalAs(UnmanagedType.LPWStr)] string sText, out int length)
{
    MessageBox.Show(sText);
    length=sText.Length;
    return sText;
}

PB 11.5 Classic
Target Framework .NET 4.5.2
Platform target x86