|
使用toolkit开发trigger的程序时,往往需要能够连续通过trigger来触发dll中的函数. 9 f9 Z/ v2 R! s, N+ u3 L0 H' q
我碰到的问题:
3 v# g c; ~& u 1.配置trigger:
: H+ _* s" V( u# R Name: CimDll
% h2 T% x6 M+ s0 d& x Event: Create PIV / P! U7 F' ~9 v4 p
Time: POST ' I9 z) u2 R. D0 ?1 Q3 l4 v
RequireNO
0 h: n2 W( t5 k: f; I% s DLL:Cim.dll
2 e% S6 m7 T8 G0 w# \ FunctionDMTPIVCreatePostOperation
' j0 a) a4 |9 b8 v
. z% t1 j, l% E9 d 2.源代码: 1 h: x" `. { ~. W4 }% p0 c
int PDMDLLInit()
; o$ c. [. h$ R6 T{
. t5 B Q: O3 z- O PTCERROR pdm_status; $ [+ U8 D: P6 q2 K
FILE *g_pfileLog; g_pfileLog =fopen("test.dat","w");
) C! `' l3 w) }) w9 ~3 C setbuf(g_pfileLog,NULL);
4 U$ m, Y0 p# Z8 v' F fprintf(g_pfileLog,"begin test\n"); & w& e9 h$ T# H( f' ^! O; U
pdm_status = PDMTriggerRegister("DMTPIVCreatePostOperation", PDMTPIVCreatePostOperation);
; a+ N8 J) `: U9 X, s1 ` if (pdm_status != PDM_SUCCESS)
! R. g1 ]5 B! _( S [: D; V$ m: | {
s1 F4 w" F7 `4 n+ ^. N+ x printf("Failed to Register Trigger PIV Create Post.\n");
- r2 r, n) \. L3 F } + }8 b& Q0 ~: j4 ]& I) \- G
return (pdm_status);
( G0 i L9 [- `- S% _7 |& ?- Y8 Z; i% B} ' j) o" f. W1 h! R/ A
int PDMTPIVCreatePostOperation(int argc, void **argv) # b$ K+ e4 \3 G6 U
{
: h2 b0 ?" u; R" l fprintf(g_pfileLog,"test\n"); . S3 S$ a2 h! ~, `' f9 c
.....
) b2 d9 N9 W- }- N! \ fprintf(g_pfileLog,"end test\n");
# S3 w; w. W# F0 b! a fclose(g_pfileLog);
5 _- L, t( E9 h0 W3 [1 E} 2 d7 V6 j0 [) X6 b" y! N& I2 o
结果:以上代码存在的问题:如果我们在第一次checkin到C/S中后,删除test.dat文件,然后再进行checkin时,发现没有再生成test.dat,在函数PDMTPIVCreatePostOperation()中所进行的对文件的操作都无效.
9 [+ X' ^. n: |- x2 z" h 原因:我们使用trigger触发时,真正起作用的是函数DMTPIVCreatePostOperation(),而PDMDLLInit()只是在第一次checkin时起作用,所以在第一次调用PDMTPIVCreatePostOperation()后,我就fclose(g_pfileLog),所以出现了上面的情况.所以注意的是:不要把一些重要的东西放在函数PDMDLLInit()中. |
|