digitalmars.D - DLL, export bool dfunc(char[] s, extern (Windows) bool function()
- Bjoern (33/33) Jan 15 2008 Subject; DLL function calls callback function in callee (parent)
- Jarrett Billingsley (12/15) Jan 15 2008 I'm guessing that 4GL expects DLL functions to use either C or Windows
- Bjoern (15/27) Jan 15 2008 Thanks Jarret!,
- Jarrett Billingsley (4/11) Jan 16 2008 That looks perfectly fine. Only thing I wonder is, does 4GL support D-s...
Subject; DLL function calls callback function in callee (parent)
like
// MyDLL a Dll written in D
export bool dfunc(char[] s,extern (Windows)char[] function() cb)
{
while ( char[] t = tokenize(s)) cb(t);
return true;
}
I have to use some 4GL code to explain:
FUNCTION GetResult(StringToAnanlyse is string = "Hello from 4GL")
// Call dfunc , pass StringToAnalyse, and address of CallBack Function
IF API("MyDLL", "dfunc", StringToAnanlyse, &ReceiveResult)
END
// The CallBack Function
PRIVATE FUNCTION ReceiveResult(token is string)
WHILE token <> ""
Trace(token)
newString += (token + ",") // defined elsewhere
END
RESULT newString
// Output
Hello
from
4GL
newString == "Hello,from,4GL,"
---------------------------------------------------
I ask here instead of D.lean because I mean the official "DLLs in D"
documents should explain this functionality too.
Oh, the question :)
export bool dfunc(char[] s, extern (Windows) char[] function() cb)
I think at least my intention is clear , so I hope somebody is willing
to show me how to implement such a DLL function.
Many thanks in advance, Bjoern
Jan 15 2008
"Bjoern" <nanali nospam-wanadoo.fr> wrote in message news:fmiien$14cf$1 digitalmars.com...export bool dfunc(char[] s, extern (Windows) char[] function() cb) I think at least my intention is clear , so I hope somebody is willing to show me how to implement such a DLL function.I'm guessing that 4GL expects DLL functions to use either C or Windows calling conventions. Secondly AFAIK there's no way to indicate the calling convention of a function pointer inline; it has to be done as an alias/typedef and then used. alias extern(Windows) char[] function() MyFuncType; // Don't know if it's extern(C) or extern(Windows) extern(Windows) export bool dfunc(char[] s, MyFuncType cb) { ... }
Jan 15 2008
Jarrett Billingsley schrieb:
I'm guessing that 4GL expects DLL functions to use either C or Windows
calling conventions. Secondly AFAIK there's no way to indicate the calling
convention of a function pointer inline; it has to be done as an
alias/typedef and then used.
alias extern(Windows) char[] function() MyFuncType;
// Don't know if it's extern(C) or extern(Windows)
extern(Windows) export bool dfunc(char[] s, MyFuncType cb)
{
...
}
Thanks Jarret!,
yes the 4GL expects Windows calling convention. (and uses just the .DLL,
no .LIB)
Using an alias instead of inlining is okay, not to say smarter!
In reality I have to use :
alias extern(Windows) void function(char[] token, bool eof) MyFuncType;
extern(Windows) export bool dfunc(char[] s, MyFuncType cb)
{
// do something and call cb, (exists in a secondary thread)
cb(token, false)
}
I hope this is correct ?
However, thanks to your help I should be able to solve the problem(s) :)
by myself. Bjoern
Jan 15 2008
"Bjoern" <nanali nospam-wanadoo.fr> wrote in message
news:fmja4s$11rq$1 digitalmars.com...
alias extern(Windows) void function(char[] token, bool eof) MyFuncType;
extern(Windows) export bool dfunc(char[] s, MyFuncType cb)
{
// do something and call cb, (exists in a secondary thread)
cb(token, false)
}
I hope this is correct ?
That looks perfectly fine. Only thing I wonder is, does 4GL support D-style
char[]? Or will it be passing/expecting C-style zero-terminated char*?
Jan 16 2008
Jarrett Billingsley schrieb:"Bjoern" <nanali nospam-wanadoo.fr> wrote in message news:fmja4s$11rq$1 digitalmars.com...Thanks for confirming Jarret, Yes it supports D style char with a little effort : MyString is string // dynamic ANSI string MyUTF8String = StringToUTF8(MyString) // toUTF16 et vice versa Heh, I still have to make tests :) But you are right, most probabely it is more economic to pass the string as pointer to C string. ( because this string could contain the contents of an complete D source file ;) ) Due to the fact that my tool is garbage collected too, passing a dynamic string's address is not secure because this address may change. A dynamic string can contain 2 GB. here (in theory ...), so using standard C string is most probabely what I have to choose. Let's see. Bjoern OT , in case that you are courious what 4GL I am using , here a link. You can download full working express copy . version 10, ( most current is 12) -- A 4GL + matrix - financial - statistic - array, dyn array, asso. array, runtime compiler,threads, outstanding GUI designer .... have fun. http://www.windev.com/windev/quick-overview-WD.htmlalias extern(Windows) void function(char[] token, bool eof) MyFuncType; extern(Windows) export bool dfunc(char[] s, MyFuncType cb) { // do something and call cb, (exists in a secondary thread) cb(token, false) } I hope this is correct ?That looks perfectly fine. Only thing I wonder is, does 4GL support D-style char[]? Or will it be passing/expecting C-style zero-terminated char*?
Jan 16 2008
// HERE I /most probabely/ can use char[]
alias extern(Windows) void function(char[] token, bool eof) MyFuncType;
// Here of course NOT !
extern(Windows) export bool dfunc(char* s, MyFuncType cb)
{
char[] tok;
// do something and call cb, (exists in a secondary thread)
cb(tok, false);
}
Sorry. Next time, I'll think twice. Bjoern
Jan 17 2008









Bjoern <nanali nospam-wanadoo.fr> 