【发布时间】:2017-10-27 17:20:51
【问题描述】:
我正在尝试在 Delphi 2007 中执行导入的函数:
function getOfficialCardNumber(): WideString ; cdecl; external 'idcapp.dll';
但几秒钟后(在调试配置中)它会停在这里:
77BD37D6 C6055562C17700 mov byte ptr [$77c16255],$00
然后说:
Debug Output: Heap block at 027D4FF8 modified at 027D5009 past requested size of 9 Process PreglediZaDom.exe (23672)
提到的函数是用 C++ (Visual Studio) 编写的
我尝试将 WideString 更改为 PWideString 等,但没有成功。有谁知道可能是什么问题?
在类似的应用程序中,但用 VB6 编写,他们给了我这个函数来转换字符串:
Public Function pisBstrToString(bstr) As String
Dim bArray() As Integer
Dim longArray() As Long
Dim str As String
Dim i As Integer
bArray = pisStringToBArray(bstr)
longArray = pisBArrayToLongArray(bArray)
str = ""
For i = 1 To UBound(longArray)
If longArray(i) > 0 And longArray(i) < 256 Then
str = str & Chr(longArray(i))
Else
str = str & pisLongToUnichar(longArray(i))
End If
Next i
pisBstrToString = str
End Function
我现在知道用 C++ 编写的函数是这样导出的:
BSTR _stdcall getOfficialCardNumber()
【问题讨论】:
-
可能翻译有误? C 或 C++ 头文件中如何声明函数?或者VB6中的函数是如何声明的?
-
我没有 C++ 头文件(dll 是由其他人构建的)。 Public Declare Function getOfficialCardNumber Lib "C:\WINDOWS\system32\idcapp.dll" () As String 是VB6中的声明
-
我怀疑 VB6 可以处理
cdecl,所以应该是stdcall。结果可能确实是WideString。 -
很久没接触VB6了,可能有以下错误:用PWideChar代替WideString。并确保使用 SysFreeString 释放结果。
-
FWIW,如果人们编写 DLL(无论使用哪种语言),他们都应该为其提供 C 或 C++ 头文件。我对编写 DLL 的看法:rvelthuis.de/articles/articles-dlls.html
标签: c++ delphi dll heap-memory