Example #1
0
void patch_with_dll(const char* dll_filename, Branch* branch, caValue* errorOut)
{
    // Check to unload this file, if it's already loaded
    unload_dll(dll_filename);

    Dll* dll = load_dll(dll_filename, errorOut);

    if (dll == NULL) {
        if (errorOut != NULL) {
            std::stringstream msg;
            msg << "load_dll failed, " << as_string(errorOut);
            set_string(errorOut, msg.str().c_str());
        }
        return;
    }

    // Call on_load (if it exists)
    OnLoadFunc onLoad = (OnLoadFunc) find_func_in_dll(dll, "on_load");
    if (onLoad != NULL)
        onLoad(branch);

    // Iterate through every function inside 'branch', and possibly replace
    // its evaluate function with one from the dll.
    patch_branch_recr(dll, branch, "");
}
Example #2
0
/**
 * Default d-tor
 */
NSCPlugin::~NSCPlugin() {
	if (isLoaded()) {
		try {
			unload_plugin();
			unload_dll();
		} catch (const NSPluginException&) {
			// ...
		}
	}
}
Example #3
0
static int
ishim_set_dll_name (const char *filepath)
{
	if (!filepath)
		filepath = "";
	lstrcpyn(f_dllpath, filepath, sizeof(f_dllpath));

	unload_dll();
	f_failed=0; /* force attempt to load */
	return load_dll();
}
Example #4
0
int load_dll(GSDLL *gsdll, char *last_error, int len)
{
char fullname[1024];
char *p;
int length;
gsapi_revision_t rv;

    /* Don't load if already loaded */
    if (gsdll->hmodule)
        return 0;

    /* First try to load DLL from the same directory as EXE */
    GetModuleFileName(GetModuleHandle(NULL), fullname, sizeof(fullname));
    if ((p = strrchr(fullname,'\\')) != (char *)NULL)
        p++;
    else
        p = fullname;
    *p = '\0';
    strcat(fullname, name);
    gsdll->hmodule = LoadLibrary(fullname);

    /* Next try to load DLL with name in registry or environment variable */
    if (gsdll->hmodule < (HINSTANCE)HINSTANCE_ERROR) {
        length = sizeof(fullname);
        if (gp_getenv("GS_DLL", fullname, &length) == 0)
            gsdll->hmodule = LoadLibrary(fullname);
    }

    /* Finally try the system search path */
    if (gsdll->hmodule < (HINSTANCE)HINSTANCE_ERROR)
        gsdll->hmodule = LoadLibrary(name);

    if (gsdll->hmodule < (HINSTANCE)HINSTANCE_ERROR) {
        /* Failed */
        DWORD err = GetLastError();
        sprintf(fullname, "Can't load DLL, LoadLibrary error code %ld", err);
        strncpy(last_error, fullname, len-1);
        gsdll->hmodule = (HINSTANCE)0;
        return 1;
    }

    /* DLL is now loaded */
    /* Get pointers to functions */
    gsdll->revision = (PFN_gsapi_revision) GetProcAddress(gsdll->hmodule,
        "gsapi_revision");
    if (gsdll->revision == NULL) {
        strncpy(last_error, "Can't find gsapi_revision\n", len-1);
        unload_dll(gsdll);
        return 1;
    }
    /* check DLL version */
    if (gsdll->revision(&rv, sizeof(rv)) != 0) {
        sprintf(fullname, "Unable to identify Ghostscript DLL revision - it must be newer than needed.\n");
        strncpy(last_error, fullname, len-1);
        unload_dll(gsdll);
        return 1;
    }
    if (rv.revision != GSREVISION) {
        sprintf(fullname, "Wrong version of DLL found.\n  Found version %ld\n  Need version  %ld\n", rv.revision, GSREVISION);
        strncpy(last_error, fullname, len-1);
        unload_dll(gsdll);
        return 1;
    }

    /* continue loading other functions */
    gsdll->new_instance = (PFN_gsapi_new_instance) GetProcAddress(gsdll->hmodule,
        "gsapi_new_instance");
    if (gsdll->new_instance == NULL) {
        strncpy(last_error, "Can't find gsapi_new_instance\n", len-1);
        unload_dll(gsdll);
        return 1;
    }

    gsdll->delete_instance = (PFN_gsapi_delete_instance) GetProcAddress(gsdll->hmodule,
        "gsapi_delete_instance");
    if (gsdll->delete_instance == NULL) {
        strncpy(last_error, "Can't find gsapi_delete_instance\n", len-1);
        unload_dll(gsdll);
        return 1;
    }

    gsdll->set_stdio = (PFN_gsapi_set_stdio) GetProcAddress(gsdll->hmodule,
        "gsapi_set_stdio");
    if (gsdll->set_stdio == NULL) {
        strncpy(last_error, "Can't find gsapi_set_stdio\n", len-1);
        unload_dll(gsdll);
        return 1;
    }

    gsdll->set_poll = (PFN_gsapi_set_poll) GetProcAddress(gsdll->hmodule,
        "gsapi_set_poll");
    if (gsdll->set_poll == NULL) {
        strncpy(last_error, "Can't find gsapi_set_poll\n", len-1);
        unload_dll(gsdll);
        return 1;
    }

    gsdll->set_display_callback = (PFN_gsapi_set_display_callback)
        GetProcAddress(gsdll->hmodule, "gsapi_set_display_callback");
    if (gsdll->set_display_callback == NULL) {
        strncpy(last_error, "Can't find gsapi_set_display_callback\n", len-1);
        unload_dll(gsdll);
        return 1;
    }

    gsdll->get_default_device_list = (PFN_gsapi_get_default_device_list)
        GetProcAddress(gsdll->hmodule, "gsapi_get_default_device_list");
    if (gsdll->get_default_device_list == NULL) {
        strncpy(last_error, "Can't find gsapi_get_default_device_list\n", len-1);
        unload_dll(gsdll);
        return 1;
    }

    gsdll->set_default_device_list = (PFN_gsapi_set_default_device_list)
        GetProcAddress(gsdll->hmodule, "gsapi_set_default_device_list");
    if (gsdll->set_default_device_list == NULL) {
        strncpy(last_error, "Can't find gsapi_set_default_device_list\n", len-1);
        unload_dll(gsdll);
        return 1;
    }

    gsdll->init_with_args = (PFN_gsapi_init_with_args)
        GetProcAddress(gsdll->hmodule, "gsapi_init_with_args");
    if (gsdll->init_with_args == NULL) {
        strncpy(last_error, "Can't find gsapi_init_with_args\n", len-1);
        unload_dll(gsdll);
        return 1;
    }

    gsdll->set_arg_encoding = (PFN_gsapi_set_arg_encoding)
        GetProcAddress(gsdll->hmodule, "gsapi_set_arg_encoding");
    if (gsdll->set_arg_encoding == NULL) {
        strncpy(last_error, "Can't find gsapi_set_arg_encoding\n", len-1);
        unload_dll(gsdll);
        return 1;
    }

    gsdll->run_string = (PFN_gsapi_run_string) GetProcAddress(gsdll->hmodule,
        "gsapi_run_string");
    if (gsdll->run_string == NULL) {
        strncpy(last_error, "Can't find gsapi_run_string\n", len-1);
        unload_dll(gsdll);
        return 1;
    }

    gsdll->exit = (PFN_gsapi_exit) GetProcAddress(gsdll->hmodule,
        "gsapi_exit");
    if (gsdll->exit == NULL) {
        strncpy(last_error, "Can't find gsapi_exit\n", len-1);
        unload_dll(gsdll);
        return 1;
    }

    gsdll->set_visual_tracer = (PFN_gsapi_set_visual_tracer)
        GetProcAddress(gsdll->hmodule, "gsapi_set_visual_tracer");
    if (gsdll->set_visual_tracer == NULL) {
        strncpy(last_error, "Can't find gsapi_set_visual_tracer\n", len-1);
        unload_dll(gsdll);
        return 1;
    }

    return 0;
}