想当然认为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传递的字符串