From e19f45b912fdce106fb31fdff6dbcc7ad391db0d Mon Sep 17 00:00:00 2001 From: Alex Zhang Date: Sat, 14 May 2022 12:30:40 +0800 Subject: [PATCH] rewrite callback for msvc --- src/dart/lib/maa_core.dart | 5 +++-- src/dart/native/callback.c | 14 +++++++------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/dart/lib/maa_core.dart b/src/dart/lib/maa_core.dart index 1db8bd8d8c..8ef43a58a9 100644 --- a/src/dart/lib/maa_core.dart +++ b/src/dart/lib/maa_core.dart @@ -36,7 +36,6 @@ class MaaCore implements MaaCoreInterface { final result = _asstLoadResource(strPtr); _resourceLoaded = _resourceLoaded || result; } - MaaCore(String libDir, [Function(String)? callback]) { _loadCppLib(libDir); if (!_apiInited) { @@ -65,7 +64,9 @@ class MaaCore implements MaaCoreInterface { void Function(dynamic) _wrapCallback(void Function(String) cb) { return (dynamic data) { // c will manage the memory for the string - String msg = data; + final Pointer ptr = Pointer.fromAddress(data as int); + String msg = ptr.toDartString(); + malloc.free(ptr); cb(msg); }; } diff --git a/src/dart/native/callback.c b/src/dart/native/callback.c index ce66b0bd0f..d9c498a5a0 100644 --- a/src/dart/native/callback.c +++ b/src/dart/native/callback.c @@ -1,6 +1,7 @@ #include "dart_api_dl.h" #include #include +#include void callback(int, const char *, void *); void init_dart_api(void *); void init_dart_api(void *api_data) { @@ -19,14 +20,13 @@ void callback(int retval, const char *json_str, void *custom_arg) { } Dart_CObject obj; int required_len = n_digits + strlen(json_str) + 1; - char retstr[required_len]; - retstr[required_len-1] = 0; - sprintf(retstr, "{\"retval\": %d, \"payload\": %s }", retval, json_str); - obj.type = Dart_CObject_kString; - obj.value.as_string = retstr; - printf("C: Sending Pointer %ld to dart through port %ld\n", (int64_t)json_str, port); + char* retptr = calloc(required_len, sizeof(char)); + snprintf(retptr, required_len, "{\"retval\": %d, \"payload\": %s }", retval, json_str); + obj.type = Dart_CObject_kInt64; + obj.value.as_string = (int64_t)retptr; + printf("C: Sending Pointer %p to dart through port %lld\n", retptr, (int64_t) port); char res = Dart_PostCObject_DL(port, &obj); if (res == 0) { printf("C: Failed to send message to Dart\n"); } -} \ No newline at end of file +}