c#动态调用dll返回值问题

我在调用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());
}
}
}
}


...全文
291 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Saleayas 2014-12-17
  • 打赏
  • 举报
回复
把 ref 去掉。
rokerker 2014-12-17
  • 打赏
  • 举报
回复
静态调用的代码看看呢
  • 打赏
  • 举报
回复
delphi感觉应该没问题,因为通过dllimport 静态调用的时候,可以正常返回结果。我也怀疑可能是编码的问题,但是,不知道从哪里找起,不知道修改哪里。
  • 打赏
  • 举报
回复
引用 5 楼 wy24789 的回复:
delegate int GetBusinessData1(string inputData, [MarshalAs(UnmanagedType.LPWStr)] ref StringBuilder outputdata); StringBuilder换成String试试
这个方法有效,但是需要再改下: delegate int GetBusinessData1([MarshalAs(UnmanagedType.LPWStr)] string inputData, [MarshalAs(UnmanagedType.LPWStr)] ref StringBuilder outputdata);
Saleayas 2014-12-17
  • 打赏
  • 举报
回复
如果你使用 DllImport 的时候,可以正确使用,而且使用了 ref 参数。 那么我估计是字符集的问题。因为没有看到你的 C 版本的签名,不是很确定。 那么使用 UnmanagedFunctionPointerAttribute 特性修饰一下那个 delegate。并且根据 C 版本的签名,确定字符集。
  • 打赏
  • 举报
回复
引用 4 楼 Saleayas 的回复:
把 ref 去掉。
这个参数,必须是引用型的
  • 打赏
  • 举报
回复
引用 3 楼 rokerker 的回复:
静态调用的代码看看呢
静态的方法没问题,我这需要动态调用!
wy24789 2014-12-17
  • 打赏
  • 举报
回复
delegate int GetBusinessData1(string inputData, [MarshalAs(UnmanagedType.LPWStr)] ref StringBuilder outputdata); StringBuilder换成String试试
threenewbee 2014-12-16
  • 打赏
  • 举报
回复
检查下delphi的字符串编码和返回,贴出有关代码

110,532

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧