|
使用toolkit开发trigger的程序时,往往需要能够连续通过trigger来触发dll中的函数.
$ T3 e# d n; R, E% `我碰到的问题:
2 I0 \" S1 T/ g8 N9 q+ p5 c 1.配置trigger:
+ m0 w1 N8 z8 N( ? Name: CimDll 6 N; E0 y* |. W
Event: Create PIV
4 T' a$ v) {1 N F2 O2 A1 H8 A Time: POST
7 X" _4 i) J0 G" }. D; V9 W, D RequireNO 1 g I. l6 y0 O/ F$ m4 u
DLL:Cim.dll 5 {2 [# E: b( g' C$ t
Function DMTPIVCreatePostOperation
) D# w7 w9 ~) D. [( R $ i& B5 h2 O) o7 N
2.源代码:
4 n9 h! V! |% N8 q, q+ _ int PDMDLLInit() ( {. K! I8 c1 I" K8 a
{
3 f; ?3 I. @. v0 x& C# [ PTCERROR pdm_status; 5 I0 s$ d! M( ]! u T2 J
FILE *g_pfileLog; g_pfileLog =fopen("test.dat","w"); # K8 e' F }' q- t6 i
setbuf(g_pfileLog,NULL); / Z& h% k- q4 i Z H4 ?: h
fprintf(g_pfileLog,"begin test\n"); 8 C1 g" ^- P2 {8 m3 c
pdm_status = PDMTriggerRegister(" DMTPIVCreatePostOperation", PDMTPIVCreatePostOperation);
$ q& ^6 W7 t5 g+ A if (pdm_status != PDM_SUCCESS) ) `: l! n+ _+ z: ]
{ ; b, A1 f' w" b8 T& |% r. o J
printf("Failed to Register Trigger PIV Create Post.\n");
/ m+ w3 P# O5 a. K } / h: [: v3 z* Q _" ~ }
return (pdm_status); ! ?# t x' B& P& t
} ' J+ q' G- u( R
int PDMTPIVCreatePostOperation(int argc, void **argv)
7 ~& K, o, H- ]9 l0 l1 V$ i% o6 d{ 1 n4 ~. W: b& H
fprintf(g_pfileLog,"test\n"); 8 _' M% P$ W! I) @0 M
..... ( j; N8 N' Y% T3 H
fprintf(g_pfileLog,"end test\n"); # J {9 L3 W+ P' b. c. c& f
fclose(g_pfileLog);
1 q3 T g" |- p! [, t) Y9 B& t} 0 B! K, x; ~1 I5 `4 O9 l' Y
结果:以上代码存在的问题:如果我们在第一次checkin到C/S中后,删除test.dat文件,然后再进行checkin时,发现没有再生成test.dat,在函数PDMTPIVCreatePostOperation()中所进行的对文件的操作都无效. 3 a3 g% Q( N# ]4 w2 ^8 m: }8 o
原因:我们使用trigger触发时,真正起作用的是函数 DMTPIVCreatePostOperation(),而PDMDLLInit()只是在第一次checkin时起作用,所以在第一次调用PDMTPIVCreatePostOperation()后,我就fclose(g_pfileLog),所以出现了上面的情况.所以注意的是:不要把一些重要的东西放在函数PDMDLLInit()中. |
|