Null terminated string

di il
5 risposte

Null terminated string

Salve a tutti ,
prima di farvi la mia domanda premetto di non esser tanto bravo come programmatore , ho iniziato da poco e vorrei imparare.
Vi prego di aver pazienza ogni aiuto sarà gradito.

Ho iniziato la mia esperienza con Game Maker , ed ora vorrei imparare altro anche su altri linguaggi.
Il motivo per cui scrivo qui è per un problemino circa una dll che ho compilato tramite Dev C++ associata ad un eseguibile di Game Maker vrs. 8.1 .

La dll avrebbe il compito di criptare/decriptare una string tramite un'altra string chiave.
L'errore con questa avviene durante la chiamata presumo , momento in cui mi restituisce il seguente messaggio:
"Access violation at address 630A6060 in module 'Arxcrypto.dll'. Read of address 000000000."

Fatte le dovute ricerche ho letto che Game Maker ho letto circa le chiamate esterne
They must return either a real or a null-terminated string.
Ho immaginato dunque che la mia variabile _out non fosse una null-terminated string.
Ingenuamente dunque ho scritto nella sorgente
_out = _out + '\0';
La chiamata mi ha restituito questo :
"Access violation at address 630A606E2 in module 'Arxcrypto.dll'. Read of address 73776655."

Ora dunque la mia domanda è : avendo una string _out come posso renderla una null-terminated string ?
Nel caso supponiate che l'errore non sia li , da cosa potrebbe esser causato ?

5 Risposte

  • Re: Null terminated string

    Ma qual è la funzione che chiami ? E come la chiami ? Mostra il codice ...
  • Re: Null terminated string

    Codice della dll:
    
    ///dllmain.cpp
    #include "dll.h"
    #include <iostream>
    #include <string>
    #include <windows.h>
    using std::string;
    
    export string _encrypt(string _in,string _key,int _mode)
    {
        int _inlen,_keylen,pos;
        _inlen = _in.length();
        _keylen = _key.length();
        char _inchar,_keychar,_outchar;
        char _inchararr[_inlen];
        char _keychararr[_keylen];
       strcpy(_inchararr,_in.c_str());
        strcpy(_keychararr,_key.c_str());
        int _inval,_keyval,_outval;
        std::string _out;
         for (int _pos=0;_pos<_inlen;pos+=1)
        {
            _inchar = _inchararr[_pos+1];
            _keychar = _keychararr[(_pos%_keylen)+1];
            _inval = (int)_inchar;
            _keyval = (int)_keychar;
            if (_mode == 1)
            {
                _outval = (_inval + _keyval) % 256;
    
            } else {
                _outval = (256 + _inval - _keyval) % 256;
            }
            _outchar = (char)_outval;
            _out = _out + _outchar;
        }
        return _out;
    }
    
    
    ///dll.h
    #ifndef _DLL_H_
    #define export extern "C" __declspec (dllexport)
    #define _DLL_H_
    
    #if BUILDING_DLL
    #define DLLIMPORT __declspec(dllexport)
    #else
    #define DLLIMPORT __declspec(dllimport)
    #endif
    
    /* class DLLIMPORT DllClass
    {
    	public:
    		DllClass();
    		virtual ~DllClass();
    		void HelloWorld();
    };
    */
    #endif
    
    Di Game Maker per chiamarla:
    
    ///obj_controller CREATE EV
    n1=get_string("Enter a string","");
    n2=get_string("Enter a key","");
    message_size(room_width,room_height);
    switch(show_message_ext ("Please chose an option ","Encrypt","Decrypt","Exit"))
    {
    case 1:
    {
    n3 = 0;
    result = external_call(external_define("Arxcrypto.dll","_encrypt",dll_stdcall,ty_string,3,ty_string,ty_string,ty_real),n1,n2,n3);
    show_message (result);
    clipboard_set_text(result);
    show_message ("Result copyied to the clipboard");
    }
    case 2:
    {
    n3 = 1;
    result =external_call(external_define("Arxcrypto.dll","_encrypt",dll_stdcall,ty_string,3,ty_string,ty_string,ty_real),n1,n2,n3);
    show_message (result);
    clipboard_set_text(result);
    show_message ("Result copyied to the clipboard");
    }
    case 3:
    script_execute (scr_exit);
    }
    
  • Re: Null terminated string

    Ma parliamo di C/C++ ? Cosa è

    external_call

    ?
  • Re: Null terminated string

    L'ultima parte è il codice in gml dell'eseguibile che chiama la funzione _encrypt della dll. Non è C++ e non dovrebbe esserci alcun problema in quel codice. Il problema credo risieda nella prima parte. Ho bisogno che _out sia una null-terminated string e non ne ho idea se lo sia o meno. Ammesso che sia li il problema.
  • Re: Null terminated string

    Beh, insomma, i problemi possono stare da tutte e due le parti.

    Tu utilizzi un int ma la chiamata avviene con un tipo ty_real, quindi non un int ma un double.

    Inoltre non devi utilizzare la classe string del C++ ma una stringa del C quindi

    export char * _encrypt(char * _in, char * _key, double _mode)

    Ovviamente dovrai allocare la memoria per la stringa da restituire ...
Devi accedere o registrarti per scrivere nel forum
5 risposte