Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
/* Copyright (C) 1996-2000 Ghostgum Software Pty Ltd.  All rights reserved.
2
 
3
  This software is provided AS-IS with no warranty, either express or
4
  implied.
5
 
6
  This software is distributed under license and may not be copied,
7
  modified or distributed except as expressly authorized under the terms
8
  of the license contained in the file LICENSE in this distribution.
9
 
10
  For more information about licensing, please refer to
11
  http://www.ghostscript.com/licensing/. For information on
12
  commercial licensing, go to http://www.artifex.com/licensing/ or
13
  contact Artifex Software, Inc., 101 Lucas Valley Road #110,
14
  San Rafael, CA  94903, U.S.A., +1(415)492-9861.
15
*/
16
 
17
/* $Id: dwdll.c,v 1.7 2004/04/08 16:18:25 giles Exp $ */
18
 
19
/* dwdll.c */
20
 
21
#define STRICT
22
#include <windows.h>
23
#include <string.h>
24
#include <stdio.h>
25
 
26
#include "stdpre.h"
27
#include "gpgetenv.h"
28
#include "gscdefs.h"
29
#define GSREVISION gs_revision
30
 
31
#define GSDLLEXPORT
32
#define GSDLLAPI CALLBACK
33
#define GSDLLCALL
34
 
35
#include "dwdll.h"
36
 
37
static const char name[] = "gsdll32.dll";
38
 
39
int load_dll(GSDLL *gsdll, char *last_error, int len)
40
{
41
char fullname[1024];
42
char *p;
43
long version;
44
int length;
45
gsapi_revision_t rv;
46
 
47
    /* Don't load if already loaded */
48
    if (gsdll->hmodule)
49
	return 0;
50
 
51
    /* First try to load DLL from the same directory as EXE */
52
    GetModuleFileName(GetModuleHandle(NULL), fullname, sizeof(fullname));
53
    if ((p = strrchr(fullname,'\\')) != (char *)NULL)
54
	p++;
55
    else
56
	p = fullname;
57
    *p = '\0';
58
    strcat(fullname, name);
59
    gsdll->hmodule = LoadLibrary(fullname);
60
 
61
    /* Next try to load DLL with name in registry or environment variable */
62
    if (gsdll->hmodule < (HINSTANCE)HINSTANCE_ERROR) {
63
	length = sizeof(fullname);
64
	if (gp_getenv("GS_DLL", fullname, &length) == 0)
65
	    gsdll->hmodule = LoadLibrary(fullname);
66
    }
67
 
68
    /* Finally try the system search path */
69
    if (gsdll->hmodule < (HINSTANCE)HINSTANCE_ERROR)
70
        gsdll->hmodule = LoadLibrary(name);
71
 
72
    if (gsdll->hmodule < (HINSTANCE)HINSTANCE_ERROR) {
73
	/* Failed */
74
	DWORD err = GetLastError();
75
	sprintf(fullname, "Can't load DLL, LoadLibrary error code %ld", err);
76
	strncpy(last_error, fullname, len-1);
77
	gsdll->hmodule = (HINSTANCE)0;
78
	return 1;
79
    }
80
 
81
    /* DLL is now loaded */
82
    /* Get pointers to functions */
83
    gsdll->revision = (PFN_gsapi_revision) GetProcAddress(gsdll->hmodule, 
84
	"gsapi_revision");
85
    if (gsdll->revision == NULL) {
86
	strncpy(last_error, "Can't find gsapi_revision\n", len-1);
87
	unload_dll(gsdll);
88
	return 1;
89
    }
90
    /* check DLL version */
91
    if (gsdll->revision(&rv, sizeof(rv)) != 0) {
92
	sprintf(fullname, "Unable to identify Ghostscript DLL revision - it must be newer than needed.\n");
93
	strncpy(last_error, fullname, len-1);
94
	unload_dll(gsdll);
95
	return 1;
96
    }
97
    if (rv.revision != GSREVISION) {
98
	sprintf(fullname, "Wrong version of DLL found.\n  Found version %ld\n  Need version  %ld\n", rv.revision, GSREVISION);
99
	strncpy(last_error, fullname, len-1);
100
	unload_dll(gsdll);
101
	return 1;
102
    }
103
 
104
    /* continue loading other functions */
105
    gsdll->new_instance = (PFN_gsapi_new_instance) GetProcAddress(gsdll->hmodule, 
106
	"gsapi_new_instance");
107
    if (gsdll->new_instance == NULL) {
108
	strncpy(last_error, "Can't find gsapi_new_instance\n", len-1);
109
	unload_dll(gsdll);
110
	return 1;
111
    }
112
 
113
    gsdll->delete_instance = (PFN_gsapi_delete_instance) GetProcAddress(gsdll->hmodule, 
114
	"gsapi_delete_instance");
115
    if (gsdll->delete_instance == NULL) {
116
	strncpy(last_error, "Can't find gsapi_delete_instance\n", len-1);
117
	unload_dll(gsdll);
118
	return 1;
119
    }
120
 
121
    gsdll->set_stdio = (PFN_gsapi_set_stdio) GetProcAddress(gsdll->hmodule, 
122
	"gsapi_set_stdio");
123
    if (gsdll->set_stdio == NULL) {
124
	strncpy(last_error, "Can't find gsapi_set_stdio\n", len-1);
125
	unload_dll(gsdll);
126
	return 1;
127
    }
128
 
129
    gsdll->set_poll = (PFN_gsapi_set_poll) GetProcAddress(gsdll->hmodule, 
130
	"gsapi_set_poll");
131
    if (gsdll->set_poll == NULL) {
132
	strncpy(last_error, "Can't find gsapi_set_poll\n", len-1);
133
	unload_dll(gsdll);
134
	return 1;
135
    }
136
 
137
    gsdll->set_display_callback = (PFN_gsapi_set_display_callback) 
138
	GetProcAddress(gsdll->hmodule, "gsapi_set_display_callback");
139
    if (gsdll->set_display_callback == NULL) {
140
	strncpy(last_error, "Can't find gsapi_set_display_callback\n", len-1);
141
	unload_dll(gsdll);
142
	return 1;
143
    }
144
 
145
    gsdll->init_with_args = (PFN_gsapi_init_with_args) 
146
	GetProcAddress(gsdll->hmodule, "gsapi_init_with_args");
147
    if (gsdll->init_with_args == NULL) {
148
	strncpy(last_error, "Can't find gsapi_init_with_args\n", len-1);
149
	unload_dll(gsdll);
150
	return 1;
151
    }
152
 
153
    gsdll->run_string = (PFN_gsapi_run_string) GetProcAddress(gsdll->hmodule, 
154
	"gsapi_run_string");
155
    if (gsdll->run_string == NULL) {
156
	strncpy(last_error, "Can't find gsapi_run_string\n", len-1);
157
	unload_dll(gsdll);
158
	return 1;
159
    }
160
 
161
    gsdll->exit = (PFN_gsapi_exit) GetProcAddress(gsdll->hmodule, 
162
	"gsapi_exit");
163
    if (gsdll->exit == NULL) {
164
	strncpy(last_error, "Can't find gsapi_exit\n", len-1);
165
	unload_dll(gsdll);
166
	return 1;
167
    }
168
 
169
    gsdll->set_visual_tracer = (PFN_gsapi_set_visual_tracer) 
170
        GetProcAddress(gsdll->hmodule, "gsapi_set_visual_tracer");
171
    if (gsdll->set_visual_tracer == NULL) {
172
	strncpy(last_error, "Can't find gsapi_set_visual_tracer\n", len-1);
173
	unload_dll(gsdll);
174
	return 1;
175
    }
176
 
177
    return 0;
178
}
179
 
180
void unload_dll(GSDLL *gsdll)
181
{
182
    /* Set functions to NULL to prevent use */
183
    gsdll->revision = NULL;
184
    gsdll->new_instance = NULL;
185
    gsdll->delete_instance = NULL;
186
    gsdll->init_with_args = NULL;
187
    gsdll->run_string = NULL;
188
    gsdll->exit = NULL;
189
    gsdll->set_stdio = NULL;
190
    gsdll->set_poll = NULL;
191
    gsdll->set_display_callback = NULL;
192
    gsdll->set_visual_tracer = NULL;
193
 
194
    if (gsdll->hmodule != (HINSTANCE)NULL)
195
	    FreeLibrary(gsdll->hmodule);
196
    gsdll->hmodule = NULL;
197
}
198
 
199