Menü
Avatar von mwiede_software
  • mwiede_software, Matthias Wiede

7 Beiträge seit 20.11.2018

Native function calling

Dafür wurde jetzt "Native function calling" integriert.
V1 erlaubt jetzt, direkt Funktionen in dynamischen Bibliotheken .so oder .dll aufzurufen und binär zu kommunizieren.
Als Beispiele sind Zugriffe auf mysqlclient.so (MySQL), libcrypto.so (OpenSSL) und libz.so (ZLib) aufgeführt.

Das Prinzip geht über die Methode call (), in der der Parameter und Rückgabewerte der Funktionen definiert werden. Mit den Funktionen binparse() und binformat() sowie memat() und memref() kann binär kommuniziert werden.

https://www.v1-script.net/native-function-call.html

Beispiel:

// Load the libZ library and return module number // Parameter true means, that libz is a native dynamic link library and no V1 module! module = dl ('libz.so', true); if (!module) { print ("Module not found."); exit (); } src = "String to compress with ZLib native function."; // Make enough destination buffer dst = ""; resize (dst, strlen (src)); // The length of the desination buffer as binary string len = binformat (strlen (src)); // Call the native function which is defined as: // int compress (void *dstBuf, int *dstLen, const char* srcBuf, int srcLen); // dst and len are reference parameters and filled with binary data by native function. ret = call (module, "compress", [['r', 'r', 's', 'i'], 'i'], dst, len, src, strlen(src)); if (ret===0) { // Parse the binary length and truncate destination string len = binparse (len); resize (dst, len); print ("Compressed string: ", dst); }

Beispiel für MySQL-Zugriff mit "Native function calling"
https://www.v1-script.net/example-mysql-client.html

Beispiel für Win32 Funktionen:

// Show a multibyte message box on Windows by calling two native functions hDLLUser32 = dl ('user32.dll', true); hDLLKernel32 = dl ('kernel32.dll', true); function MultiByteToWideChar (src) { global hDLLKernel32; dst = ""; resize (dst, strlen(src)*2); // Make enough buffer for wide char string size = call (hDLLKernel32, "MultiByteToWideChar", [["i","i", "s", "i", 'r','i'], "i"], 65001, 0, src, -1, dst, 128); resize (dst, size*2); // Resize to correct length (byte aligned) return dst; } function MessageBox (text, topic="Info") { global hDLLUser32; call (hDLLUser32, "MessageBoxW", [["p","s", "s", "i"], "i"], null, MultiByteToWideChar(text), MultiByteToWideChar (topic), 0|0x00000030); } if (hDLLKernel32) { MessageBox ("специальный символ"); }

Das Posting wurde vom Benutzer editiert (21.03.2019 10:13).

Bewerten
- +
Anzeige