PureBasicで作ったDLLにPureBasicで作ったアプリケーションから配列を渡すのに手こずって、なんとか解決したのでそのメモ
※配列を渡す際に、配列のアドレスへのアドレス、配列へのポインタへのポインタというべきか。それをパラメータに入れて呼び出さないといけない。
呼び出し側
Dim MyArray.d(4) MyArray(0) = 123.0 MyArray(1) = 123.1 MyArray(2) = 123.2 MyArray(3) = 123.3 MyArray(4) = 123.4 If OpenLibrary(0, "mydll.dll") Or OpenLibrary(0, "mydll.so") ptr = @MyArray() CallFunction(0, "DispArray", @ptr ) EndIf
DLL側
CompilerIf #PB_Compiler_OS = #PB_OS_Windows ; These 4 procedures are Windows specific ; ; This procedure is called once, when the program loads the library ; for the first time. All init stuffs can be done here (but not DirectX init) ; ProcedureDLL AttachProcess(Instance) EndProcedure ; Called when the program release (free) the DLL ; ProcedureDLL DetachProcess(Instance) EndProcedure ; Both are called when a thread in a program call or release (free) the DLL ; ProcedureDLL AttachThread(Instance) EndProcedure ProcedureDLL DetachThread(Instance) EndProcedure CompilerEndIf ; Real code start here.. ; ProcedureDLL EasyRequester(Message$) MessageRequester("EasyRequester !", Message$) EndProcedure ProcedureDLL DispArray( Array MyArray.d(1) ) strArray.s = "" MessageRequester("ArraySize", Str(ArraySize(MyArray(), 1)) ) For x.l = 0 To ArraySize( MyArray(), 1) strArray = strArray + StrD(MyArray(x)) + #CRLF$ ;MessageRequester("MyArray("+Str(x)+")", StrD(MyArray(x)) ) Next x MessageRequester("DispArray", strArray) EndProcedure
参考にしたサイト
・Array parameter in procedures (PureBasic Forum)
・Building a DLL (PureBasic.com Documentation)