Thread perlembed + dllmain (0 answers)
Opened by Gast at 2007-04-06 13:33

Gast Gast
 2007-04-06 13:33
#75709 #75709
Hallo,

ich möchte Perl in eine DLL einbetten. Nach der Anleitung auf perldoc.perl.org klappt das Einbetten auch.

Nun soll das Perl-Skript nur geparst werden, wenn die DLL geladen wird.

Danach wird die Funktion test() beliebig oft aufgerufen.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <EXTERN.h>
#include <perl.h>
#include <time.h>
#include <stdlib.h>
#include <windows.h>
#include <stdio.h>

#define EXPORT __declspec(dllexport)

PerlInterpreter *my_perl;

BOOL WINAPI DllMain(
HINSTANCE hinstDLL, // handle to DLL module
DWORD fdwReason, // reason for calling function
LPVOID lpReserved ) // reserved
{
switch( fdwReason )
{
case DLL_PROCESS_ATTACH: {
//Perlskript parsen
char *embedding[] = { "", "C:\\script.pl", "0" };
my_perl = perl_alloc();
perl_construct(my_perl);
perl_parse(my_perl, NULL, 3, embedding, NULL);
PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
break;
}
case DLL_THREAD_ATTACH: {
// Do thread-specific initialization.
break;
}
case DLL_THREAD_DETACH: {
// Do thread-specific cleanup.
break;
}
case DLL_PROCESS_DETACH: {
perl_free(my_perl);
PERL_SYS_TERM();
break;
}

}
return TRUE; // Successful DLL_PROCESS_ATTACH.
}


EXPORT int test()
{
char *args[] = { NULL };
call_argv("perlfunction", G_DISCARD | G_NOARGS, args);
return 0;
}


DAS PROBLEM: Das klappt nur beim ersten Aufruf von test(). Beim zweiten Aufruf von test() bekomme gibt es einen Speicherfehler: 0xc0000005

View full thread perlembed + dllmain