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;
}
|