| 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   BlitzBasic:  [AUSKLAPPEN]  [EINKLAPPEN]
 Const DECL_FILE$ = "test.decls"
 
 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
 
 
 
 Local dllName$ = ReadLine$(iStream)
 
 While(Not Left$(dllName$,4) = ".lib")
 dllName$ = ReadLine$(iStream)
 Wend
 
 dllName$ = Trim(Replace(Right$(dllName$, Len(dllName$)-4), Chr$(34), ""))
 
 
 Local headerName$ = Left$(dllName$, Instr(dllName$, ".")-1)
 
 
 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)
 
 
 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$)
 
 
 
 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))
 
 
 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$)
 
 
 Local start% = Instr(declLine$, "(")
 Local length% = Instr(declLine$, ")")-start%-1
 Local temp$ = Mid$(declLine$, start%+1, length%)
 Local parameter$ = ""
 
 
 temp$ = Replace$(temp$, " ", "")
 
 If(Len(temp$)=0) Return ""
 
 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
  ) 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]  [EINKLAPPEN]
 #include "test.h"
 int main(){
 using namespace test;
 init();
 //Methodenaufrufe
 freeLib();
 return 0;
 }
 |