1 
2 
3 #pragma warning(disable : 4996)
4 
5 #include <windows.h>
6 #include <stdlib.h>
7 
8 #include "ttwain_state.h"
9 #include "ttwainP.h"
10 #include "ttwain_statePD.h"
11 #include "ttwain_util.h"
12 
13 #ifdef __cplusplus
14 extern "C" {
15 #endif
16 
17 static void *hDSMLib; /* handle of DSM */
18 extern void TTWAIN_SetState(TWAINSTATE status);
19 
TTWAIN_LoadSourceManagerPD(void)20 int TTWAIN_LoadSourceManagerPD(void) {
21   char winDir[_MAX_PATH];
22 
23   if (TTWAIN_GetState() >= TWAIN_SM_LOADED)
24     return TRUE; /* DSM already loaded */
25 
26   GetWindowsDirectory(winDir, _MAX_PATH);
27   if (!winDir[0]) return FALSE;
28 
29   strcat(winDir, "\\system32\\");
30   // strcat(winDir, "\\");
31   strcat(winDir, DSM_FILENAME);
32 
33   hDSMLib = LoadLibrary(winDir);
34 
35   /*
36 if (tnz_access(winDir, 0x00) != -1)
37 hDSMLib = LoadLibrary(winDir);
38 else
39 {
40 hDSMLib = 0;
41 return FALSE;
42 }
43 */
44 
45   if (hDSMLib) {
46     TTwainData.DSM_Entry =
47         (DSMENTRYPROC)GetProcAddress(hDSMLib, DSM_ENTRYPOINT);
48     if (TTwainData.DSM_Entry) {
49       TTWAIN_SetAvailable(AVAIABLE_YES);
50       TTWAIN_SetState(TWAIN_SM_LOADED);
51     } else {
52       FreeLibrary(hDSMLib);
53       hDSMLib = NULL;
54     }
55   } else {
56     DWORD err            = GetLastError();
57     TTwainData.DSM_Entry = 0;
58   }
59   return (TTWAIN_GetState() >= TWAIN_SM_LOADED);
60 }
61 /*---------------------------------------------------------------------------*/
TTWAIN_UnloadSourceManagerPD(void)62 int TTWAIN_UnloadSourceManagerPD(void) {
63   if (TTWAIN_GetState() == TWAIN_SM_LOADED) {
64     if (hDSMLib) {
65       FreeLibrary(hDSMLib);
66       hDSMLib = NULL;
67     }
68     TTwainData.DSM_Entry = NULL;
69     TTWAIN_SetState(TWAIN_PRESESSION);
70   }
71   return (TTWAIN_GetState() == TWAIN_PRESESSION);
72 }
73 /*---------------------------------------------------------------------------*/
74 
75 #ifdef __cplusplus
76 }
77 #endif
78