我在调用delphi开发的一个测试dll时,如果是静态调用可以正确返回值,dll的功能就是在传入字符串的基础上拼接加上Success。
例如:传入字符串 1234,则返回 1234Success。
可是当动态调用的就是无法返回正确的结果,调用的时候也没报错,感觉调用成功了,可就是返回值不是正确的。例如:
传入字符串 1234,返回值则是:12?
我动态调用dll的方法如下,请高手们看看我那个地方不对:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace dllImport
{
public partial class Form1 : Form
{
[DllImport("kernel32.dll", EntryPoint = "LoadLibrary")]
static extern int LoadLibrary([MarshalAs(UnmanagedType.LPStr)] string lpLibFileName);
[DllImport("kernel32.dll", EntryPoint = "GetProcAddress")]
static extern IntPtr GetProcAddress(int hModule, [MarshalAs(UnmanagedType.LPStr)] string lpProcName);
[DllImport("kernel32.dll", EntryPoint = "FreeLibrary")]
static extern bool FreeLibrary(int hModule);
delegate int GetBusinessData1(string inputData, ref StringBuilder outputdata);
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
try
{ string _dllpath = @"G:\program\dllImport\Project2.dll";
string inputData = "1234";
StringBuilder AOutputData = new StringBuilder(213273);
int hModule = LoadLibrary(_dllpath);
if (hModule == 0)
return;
//得到指向Add函数的指针
IntPtr intPtr = GetProcAddress(hModule, "GetBusinessData");
GetBusinessData1 myfun = (GetBusinessData1)Marshal.GetDelegateForFunctionPointer(intPtr, typeof(GetBusinessData1));
int iReturn = myfun(inputData, ref AOutputData);
MessageBox.Show(AOutputData.ToString());
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
}
}
------解决思路----------------------
delegate int GetBusinessData1(string inputData, [MarshalAs(UnmanagedType.LPWStr)] ref StringBuilder outputdata);
StringBuilder换成String试试
------解决思路----------------------
如果你使用 DllImport 的时候,可以正确使用,而且使用了 ref 参数。
那么我估计是字符集的问题。因为没有看到你的 C 版本的签名,不是很确定。
那么使用 UnmanagedFunctionPointerAttribute 特性修饰一下那个 delegate。并且根据 C 版本的签名,确定字符集。