C Header aus decls erstellen

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

 

$tankY

Betreff: C Header aus decls erstellen

BeitragMo, Apr 05, 2010 15:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Wer die BlitzBasic DLLs auch in C/C++ verwenden will, aber keinen Zugang zum Quelltext hat, kann jetzt einfach einen Header aus der decls-Datei erstellen Laughing
BlitzBasic: [AUSKLAPPEN]
;.decl filename
Const DECL_FILE$ = "test.decls"
;.h C headername / outputfile
Const HEADER_FILE$ = "test.h"

Type method
Field returnType$
Field methodName$
Field dllMethodName$
Field parameter$
End Type

createHeader()

Function createHeader()

Local iStream = OpenFile(DECL_FILE$)

If(iStream=0) Return

;read in .decl file (read dll name, methodnames, etc)
;read in .dll name
Local dllName$ = ReadLine$(iStream)

While(Not Left$(dllName$,4) = ".lib")
dllName$ = ReadLine$(iStream)
Wend

dllName$ = Trim(Replace(Right$(dllName$, Len(dllName$)-4), Chr$(34), ""))

;generate header name from dllName
Local headerName$ = Left$(dllName$, Instr(dllName$, ".")-1)

;read in methods and save in type
Local declLine$ = ReadLine$(iStream)

While(Not Eof(iStream))
If(Instr(declLine$, ":")>0) Then
returnType$ = getReturnType$(declLine$)
methodName$ = getMethodName$(declLine$)
dllMethodName$ = getDLLMethodName$(declLine$)
parameter$ = getParameter$(declLine$)

methods.method = New method
methods\returnType$ = returnType$
methods\methodName$ = methodName$
methods\dllMethodName$ = dllMethodName$
methods\parameter$ = parameter$
EndIf

declLine = ReadLine$(iStream)
Wend

CloseFile(iStream)

;write header file
Local oStream = WriteFile(HEADER_FILE$)


WriteLine(oStream, "#ifndef "+headerName$)
WriteLine(oStream, "#define "+headerName$)
WriteLine(oStream, "")
WriteLine(oStream, "#include <windows.h> //DLL support")
WriteLine(oStream, "")
WriteLine(oStream, "namespace "+Lower$(headerName$)+"{")
WriteLine(oStream, " HINSTANCE hDLL;")
WriteLine(oStream, " ")
WriteLine(oStream, " //Declare prototypes")

For methods.method = Each method
WriteLine(oStream, " typedef "+methods\returnType$+"(WINAPI *DLL_"+methods\methodName$+")("+methods\parameter$+");")
WriteLine(oStream, " DLL_"+methods\methodName$+" "+methods\methodname$+";")
Next

WriteLine(oStream, " ")
WriteLine(oStream, " //load dll")
WriteLine(oStream, " void init(){")
WriteLine(oStream, " hDLL = LoadLibrary("+Chr$(34)+dllName$+Chr$(34)+");")
WriteLine(oStream, " ")

For methods.method = Each method
WriteLine(oStream, " "+methods\methodName$+" = (DLL_"+methods\methodName$+")GetProcAddress(hDLL,"+Chr$(34)+methods\dllMethodName$+Chr$(34)+");")
Next

WriteLine(oStream, " }")
WriteLine(oStream, " ")
WriteLine(oStream, " //free dll (call at the end of the program)")
WriteLine(oStream, " void freeLib(){")
WriteLine(oStream, " FreeLibrary(hDLL);")
WriteLine(oStream, " }")
WriteLine(oStream, "}")
WriteLine(oStream, "")
WriteLine(oStream, "#endif")

CloseFile(oStream)

Return

End Function

Function getReturnType$(declLine$)

;myFunction%():"myFunction@0"
;=> int
Local typeChar$ = Mid$(declLine$, Instr(declLine$, "(")-1, 1)

Select(typeChar$)
Case "%":
Return "int"
Case "#":
Return "float"
Case "$":
Return "char *"
Case "*":
Return "int *"
Default:
Return "void"
End Select

End Function

Function getMethodName$(declLine$)
Local methodName$ = Trim$(Left$(declLine$, Instr(declLine$, "(")-1))

;Remove return-type-characters
methodName$ = Replace$(Replace$(Replace$(Replace$(methodName$, "%", ""), "#", ""), "$", ""), "*", "")

Return methodName$

End Function

Function getDLLMethodName$(declLine$)
Local start% = Instr(declLine$, Chr$(34))
Local length% = Instr(declLine$, Chr$(34), start%+1)-start%-1
Local dllMethodName$ = Mid$(declLine$, start%+1, length%)

Return dllMethodName$
End Function

Function getParameter$(declLine$)
;myFunction%(a%, b$):"myFunction@0"
;=>int a, char *b
Local start% = Instr(declLine$, "(")
Local length% = Instr(declLine$, ")")-start%-1
Local temp$ = Mid$(declLine$, start%+1, length%)
Local parameter$ = ""

;remove spaces
temp$ = Replace$(temp$, " ", "")

If(Len(temp$)=0) Return "" ;no parameter

Local variable$ = ""
Local variableType$ = ""

For i=1 To Len(temp$)
curChar$ = Mid$(temp$, i, 1)
If(curChar=",") Then
If(Len(parameter$)>0) parameter$ = parameter$ + ", "
parameter$ = parameter+variableType$+variable$
variable$ = ""
variableType$ = ""
ElseIf(curChar="%") Then
variableType$ = "int "
ElseIf(curChar="#") Then
variableType$ = "float "
ElseIf(curChar="$") Then
variableType$ = "char *"
ElseIf(curChar="*") Then
variableType$ = "int *"
Else
variable$ = variable$ + curChar$
EndIf
Next

If(Len(parameter$)>0) parameter$ = parameter$ + ", "
parameter$ = parameter+variableType$+variable$

Return parameter$

End Function


Funktioniert im Moment nur, wenn in der decls-Datei nur eine DLL geladen wird (in dem Fall einfach die decls aufteilen Wink )
Die Idee stammt von hier, jedoch wurden alle Methoden in die main() geklatscht.
Der Header verwendet einen eigenen Namespace (DLL-Name, kleingeschrieben).
Einbindung:
Code: [AUSKLAPPEN]
#include "test.h"

int main(){
    using namespace test;
    init();
    //Methodenaufrufe   
    freeLib();
    return 0;
}

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group