首页 新闻 会员 周边

Delphi7封装的DLL库,var ReturnXmlInf:Pchar 参数易语言要如何调用

0
悬赏园豆:10 [待解决问题]

问题:
易语言在调用以var ReturnXmlInf:Pchar传值的函数 WeiXinQueryEx1 时崩溃闪退,vb6、vfp、delphi、c#、.net调用是正常的证明函数封装没问题。

Delphi7 动态库函数原型:
function WeiXinQueryEx1(inappid:Pchar;inmchid:Pchar;inIdkey:Pchar;KeyLOck:byte;inNum:Pchar;var ReturnXmlInf:Pchar):integer;stdcall;

vb6中函数声明:
Public Declare Function WeiXinQueryEx1 Lib "PayApiFun.dll" (ByVal Lockappid As String, ByVal Lockmchid As String, ByVal Idkey As String, ByVal IdkeyLock As Integer, ByVal OrdNum As String, ByRef outinf As Any) As Integer

vfp中函数声明:
declare integer WeiXinQueryEx1 in PayApiFun.dll string Lockappid,string Lockmchid,string Idkey,integer Idkeylock, string OrdNum,integer @ outinf

vb.net函数声明:
Private Declare Function WeiXinQueryEx1 Lib "PayApiFun.dll" (ByVal Lockappid As String, ByVal Lockmchid As String, ByVal Idkey As String, ByVal IdkeyLock As Integer, ByVal OrdNum As String, ByRef outinf As IntPtr) As Integer

c#调用声明:
[DllImport("PayApiFun.dll", EntryPoint = "WeiXinQueryEx1", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
static extern int WeiXinQueryEx1(string Lockappid, string Lockmchid, string Idkey, int IdkeyLock, string OrdNum, ref IntPtr outputstr);

< >
分享
所有回答(2)
0

在易语言中调用具有var ReturnXmlInf: Pchar参数的Delphi7封装的DLL库函数 WeiXinQueryEx1,你可以按照以下步骤进行:

  1. 在易语言中声明函数:
Declare Function WeiXinQueryEx1 Lib "PayApiFun.dll" Alias "_WeiXinQueryEx1@24" (ByVal inappid As Ptr, ByVal inmchid As Ptr, ByVal inIdkey As Ptr, ByVal KeyLOck As Long, ByVal inNum As Ptr, ByRef ReturnXmlInf As Ptr) As Long
  1. 在调用函数之前,先为 ReturnXmlInf 变量分配内存:
Dim ReturnXmlInf As Ptr
ReturnXmlInf = Space$(1024) '根据实际情况分配足够的内存空间
  1. 调用函数:
Dim inappid As String
Dim inmchid As String
Dim inIdkey As String
Dim KeyLOck As Long
Dim inNum As String

inappid = "your_appid"
inmchid = "your_mchid"
inIdkey = "your_idkey"
KeyLOck = 0 '根据实际情况设置
inNum = "your_ordernum"

Dim result As Long
result = WeiXinQueryEx1(StrPtr(inappid), StrPtr(inmchid), StrPtr(inIdkey), KeyLOck, StrPtr(inNum), ReturnXmlInf)

If result = 0 Then
    '调用成功,可以使用 ReturnXmlInf 变量获取返回的字符串值
    Dim returnString As String
    returnString = PtrToStr(ReturnXmlInf)
    MsgBox returnString
Else
    '调用失败,根据实际情况处理错误
    MsgBox "调用失败"
End If
lanedm | 园豆:2381 (老鸟四级) | 2023-06-27 08:53

感谢您的回复
我是一棵易语言的小白菜,使用的是 易语言 5.9! 它的函数声明好象是这样声明的,

您这个好象是 vb6的代码,我应如何在易语言中象您这样声明?

支持(0) 反对(0) 一卡通设备制造商 | 园豆:192 (初学一级) | 2023-06-27 09:13

@lanedm: 非常感谢您的 回复,我先看看。

支持(0) 反对(0) 一卡通设备制造商 | 园豆:192 (初学一级) | 2023-06-27 10:14
0

在易语言中调用具有 var ReturnXmlInf: PChar 参数的 Delphi 7 封装的 DLL 函数时,你可能需要进行一些特殊处理。由于易语言和 Delphi 7 使用不同的字符串编码方式和内存管理机制,直接传递 PChar 可能导致崩溃或闪退。

以下是一种可能的解决方案,你可以尝试在易语言中调用该函数:

在易语言中声明函数:
vb
Copy code
Declare Function WeiXinQueryEx1 Lib "PayApiFun.dll" Alias "_WeiXinQueryEx1@24" (ByVal inappid As LPCSTR, ByVal inmchid As LPCSTR, ByVal inIdkey As LPCSTR, ByVal KeyLock As Integer, ByVal inNum As LPCSTR, ByRef ReturnXmlInf As LPCSTR) As Integer
在调用函数之前,首先将返回值 ReturnXmlInf 定义为一个固定长度的字符串变量,用于接收返回的字符串:
vb
Copy code
Dim ReturnXmlInf As String * 256 ' 假设字符串长度不超过 256 个字符
调用函数:
vb
Copy code
Dim result As Integer
result = WeiXinQueryEx1("your_inappid", "your_inmchid", "your_inIdkey", your_KeyLock, "your_inNum", ReturnXmlInf)
请根据实际情况替换参数名称和值。

这种方法使用了固定长度的字符串变量来接收返回值,并使用函数别名进行函数声明。这样做可以确保易语言能够正确处理字符串的编码和内存管理。

请注意,这只是一种尝试,具体实现可能因环境和函数定义而有所不同。如果问题仍然存在,请提供更多细节或尝试查阅易语言的文档或社区资源以获取更多帮助。

Technologyforgood | 园豆:5992 (大侠五级) | 2023-06-27 22:09

非常感谢 您的回复!

支持(0) 反对(0) 一卡通设备制造商 | 园豆:192 (初学一级) | 2023-06-28 09:26
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册