想当然认为PB的string类型与FB的string相同,结果按值接收却总是为空。
'FreeBasic 函数输出一个字符串
Public function getstr stdcall Alias "getstr"() as string Export
function = "hello!!"
end function
'在PowerBasic中引用并接收这个字符串
DECLARE FUNCTION getstr LIB "test.dll" STDCALL ALIAS "getstr@0"() AS string
MsgBox getstr()
'实际总是返回空值
表面上好像看上去没有问题,但为何无法接收到FB传递过来的字符串"hello!!"呢?
再次查看了FB对于string类型的说明,这才发现它是一个字节数组,在传递过程中只能按地址传递,而不像PB可以按值传递。类似PB中的ASCIIZ类型。
所以在PB中引用定义导入的类型就不能使用string作为接收类型了,而应该用dword作为地址接收类型。重新测试后成功接收到FB传递的字符串。
'FreeBasic导出函数,输出一个字符串
Public function getstr stdcall Alias "getstr"() as string Export
function = "hello!!"
end function
'在PowerBasic中引用做如下调整
DECLARE FUNCTION getstr LIB "test.dll" STDCALL ALIAS "getstr@0"() AS DWORD
LOCAL pBuf AS ASCIIZ PTR
pBuf = getstr()
MSGBOX @@pBuf
'成功获取到FB传递的字符串

本文探讨了在FreeBasic(FB)和PowerBasic(PB)之间进行函数调用时遇到的问题,重点在于两者对于string类型的处理差异。原来,FB的string类型在传递时只能按地址传递,而不能像PB那样按值传递。通过修改PB的导入声明,将接收类型从string改为DWORD并使用指针来获取字符串,最终成功解决了跨语言字符串传递的难题。
937

被折叠的 条评论
为什么被折叠?



