freebasic 制作dll并导出函数

记录一下自己使用freebasic来制作标准的dll导出函数来给vb6调用。当然了在vba里也是可以使用的。今天就用fb写一个调用管道的导出函数。我用的ide是 VisualFreebasic.是勇芳大佬在老外的基础上进行打造的。体验效果还不错。自己可以百度去下载,是绿色免费的。言归正传,创建dll操作如下

文件--新建,如下图,选择标准dll工程:

在建立的dll模板里面deFF_WINMAIN文件里面自带了2个导出函数,我们可以删掉。我们如果只是写一般的导出函数,只需要在module.inc模块文件里写就行了。

编译生成dll文件。

我默认生成32位的dll.值得注意的是freebasic是支持win64平台的。因为我是用vb6默认只选择生成32位的dll.

 因为涉及到vb6字符串转化为fb里的字符串和将fb语言的字符串转化为vb6里的bstr字符串,所以里面涉及到参数和返回结果的转换。我就不多说了。代码如下:

Function BStrToString(Byval nBStr As BStr) As String  '将VB里的字符串转换为FB里使用的字符串
    Dim L As Long =Peek(Long,Cast(UInteger,nBStr) -4)
    Dim ss As String = String(L,0)
    memcpy StrPtr(ss),nBStr,L
    Return ss
End Function

Function StringToBStr(ByVal nStr As String) As BStr  '将FB里的字符串转换为VB里使用的字符串
  Return SysAllocString( Cast(WString Ptr, StrPtr(nStr) ) ) '伪造 VB 字符串
End Function
Function CmdStdOut(ByVal CmdString As BSTR) As BSTR Export  
'ByVal 由于VB和FB默认表达不同,避免发生不一至的情况,前面的必须加个,和VB那边一样。
Dim c As String = BStrToString(CmdString)
Dim f As Integer=FreeFile
Open Pipe c For Input As #f
Dim As String total,ln
Do Until EOF(f)
    Line Input #f, ln
    total+ =ln + !"\r\n"
Loop
Close #f
Return StringToBStr(total)
End Function

生成的dll我用dependencywalker查看下,可以看到导出了函数,变成了大写和加了@序号:

再和vb生成的exe放在同一目录下调用测试。调用方式就是和API的申明是一样的。看下图:

当然我们也可以让导出的函数名称更加标准。而且不添加序号和改变大小写。办法就是用Extern “C”...... End Extern里面定义函数。如下图。但是这时候我们写的函数不能放在模块里,而要放在FF_Appstart文件里面。另外由于向C靠拢了。在变量方面的类型和写法也要向C靠拢了。好了,先写到这里吧。

猜你喜欢

转载自blog.csdn.net/qq_24499417/article/details/104425426