Hallo Zusammen,
meiner einer wäre sehr dankbar wenn hier ein "DLL Kündiger" antworten würde.
Das Problem, ich möchte die yacasdll.dll unter Autoit3 nutzen, aber es funktioniert leider nicht so wie erhofft. Die Problemlösung ist evtl. auch für andere Leute interessant weil yacas ein kleines aber IMO mächtiges Computer Algebra System ist.
(Allgemeine info zu yacas, und hier gibts es die DLL)
Unter freepascal sieht eine lauffähige Lösung so aus:
program yacas;
const YACASAPI='yacasdll.dll';
{
/** yacas_init : initialize Yacas. This function has to be called before calling the
* other functions. This function establishes a main evaluation environment
* for Yacas expressions to be simplified in.
*/
YACASDLL_API void yacas_init(); }
procedure yacas_init; cdecl; external YACASAPI;
{
/** yacas_eval : evaluate an expression. The result (or possible error)
* can be obtained through the yacas_error and yacas_result functions,
* if so desired.
*/
YACASDLL_API void yacas_eval(char* expression); }
procedure yacas_eval(expression:Pchar);cdecl; external YACASAPI;
{
/** yacas_error : return a pointer to a string explaining the error
* if an error occurred, or NULL otherwise.
*/
YACASDLL_API char* yacas_error();
} function yacas_error:PChar; cdecl; external YACASAPI;
{
/** yacas_result : return a string representation of the result of
* evaluating an expression. This function is only meaningful if
* there was no error. In the case of an error, the return value
* of yacas_result should be considered undefined.
*/
YACASDLL_API char* yacas_result();}
function yacas_result:PChar; cdecl; external YACASAPI;
{
/** yacas_output : return pointer to output printed while evaluating
* an expression.
*/
YACASDLL_API char* yacas_output(); }
function yacas_output:PChar; cdecl; external YACASAPI;
{
/** yacas_exit : clean up all things related to the main Yacas
* evaluation environment
*/
YACASDLL_API void yacas_exit(); }
procedure yacas_exit; cdecl; external YACASAPI;
{
/** yacas_interrupt : interrupt a calculation.
*/
YACASDLL_API void yacas_interrupt();
}
procedure yacas_interrupt(); cdecl; external YACASAPI;
begin
yacas_init;
yacas_eval('1+1');
writeln(yacas_result);
yacas_exit;
end.
Alles anzeigen
Normalerweise wäre es kein Problem das in Autoit um zu setzten, dachte ich
func yacas_init()
local $re
global $dllh = dllopen("yacasdll.dll")
$re = dllcall($dllh,"none","yacas_init")
; writeln("init>"&@error)
endfunc
func yacas_eval($s)
local $re
$ll = 100;try this
$re = dllcall($dllh,"none","yacas_eval","str:cdecl",$s)
; writeln("eval>"&@error)
endfunc
func yacas_result()
local $re
$re = dllcall($dllh,"str:cdecl","yacas_result")
; writeln("result>"&@error)
return $re[0]
endfunc
yacas_init()
yacas_eval("1+1")
writeln(yacas_result())
dllclose("yacas.dll")
Alles anzeigen
Die yacas_init und yacas_result Funktion funktionieren auch in AU3, leider aber das wichtige yacas_eval nicht.
Bach einiger Überlegung glaube ich, dass der Grund dafür ist, dass der C Ausdruck "YACASDLL_API void yacas_eval(char* expression)" keinen "str:cdecl" erwartet sondern einen Pointer auf einen char oder so etwas ähnliches. Ich steh nun wie der Ochs vorm Berg weil, 1. der freepascal compiler es scheinbar auch ohne pointer aufrufen kann, und ich mich mit den DllStructCreate und DllStructSetData gedönse in AU3, besonders wenn pointer im Spiel sind leider gar nicht auskenne.
Vielen Dank. Mit freundlichen Grüßen
uuchip