|
使用toolkit開發trigger的程序時,往往需要能夠連續通過trigger來觸發dll中的函數. . {4 G! c# Z5 D7 g$ J; U5 h
我碰到的問題: % ?0 T. n9 ^, z
1.配置trigger: ! H1 Y' U2 ?( ?2 U7 m
Name: CimDll ' x! v( a* W7 O! ~3 w U- ]% [
Event: Create PIV ( o( ~; |4 o! u8 i/ {
Time: POST 7 x$ M3 ^( z5 Y6 s
RequireNO % c1 H8 M8 d! d: @ Z
DLL:Cim.dll * s7 y' u7 b+ a& W0 G+ O2 [
Function DMTPIVCreatePostOperation + X5 `# } g& i$ U; Z$ Q1 ]
, L: j* p |7 ~, @, K6 K 2.源代碼:
' S7 l5 V" y5 L) G4 p' X4 K int PDMDLLInit()
1 J7 e* {/ ~' n$ m$ h6 Y' \0 B% l{
0 p1 x; ~4 W2 c7 b PTCERROR pdm_status;
: B3 K V$ U: p% L* ] FILE *g_pfileLog; g_pfileLog =fopen("test.dat","w");
4 k7 n# Q, o- U3 Z/ `* o& d3 ` setbuf(g_pfileLog,NULL); 2 |0 w% H/ c$ P
fprintf(g_pfileLog,"begin test\n"); 1 ?* Z1 B/ Q: q, o6 _/ \
pdm_status = PDMTriggerRegister(" DMTPIVCreatePostOperation", PDMTPIVCreatePostOperation); ) Q5 G- k" Q$ V1 R' u
if (pdm_status != PDM_SUCCESS)
: K7 z/ v! v; ~' S. n# ~, _0 y5 i {
! `& `. c; f9 ~ printf("Failed to Register Trigger PIV Create Post.\n"); * C m5 z" T. M8 H/ Y+ C/ L
} % H1 g# L' V/ [1 L- N/ l
return (pdm_status);
9 q1 ~* P! V* V7 N} , S* M: t9 t5 H2 r
int PDMTPIVCreatePostOperation(int argc, void **argv) 0 r* m6 `2 _2 P/ F/ |$ @
{ ; r2 x2 a' L" {: l/ ^$ l3 s: Y
fprintf(g_pfileLog,"test\n");
" p1 r' i! _7 t ..... : `- M0 m4 J, l9 N# [
fprintf(g_pfileLog,"end test\n"); + O' W, j2 H, O8 O
fclose(g_pfileLog); - D% U( P: X# c+ Z! \5 u; \6 b: ^
} : i; P1 L, }/ F, a5 z$ f6 ^- O
結果:以上代碼存在的問題:如果我們在第一次checkin到C/S中后,刪除test.dat文件,然后再進行checkin時,發現沒有再生成test.dat,在函數PDMTPIVCreatePostOperation()中所進行的對文件的操作都無效. - k# ]3 x" S+ q$ A
原因:我們使用trigger觸發時,真正起作用的是函數 DMTPIVCreatePostOperation(),而PDMDLLInit()只是在第一次checkin時起作用,所以在第一次調用PDMTPIVCreatePostOperation()后,我就fclose(g_pfileLog),所以出現了上面的情況.所以注意的是:不要把一些重要的東西放在函數PDMDLLInit()中. |
|