저는 C 언어를 처음 사용하기 때문에 대답이 분명 할 수는 있지만 주위를 둘러 볼 수는 없습니다.C struct 인스턴스가 이전 인스턴스를 덮어 씁니다.
C++ vector kind of structure in C을 만들려고합니다. Windows EnumWindows 함수를 사용하여 모든 창을 반복합니다. 콜백 함수에서 각 창에 대해 windowHandle 구조의 새 인스턴스를 만듭니다. 그러나 어떤 이유로 새로운 인스턴스를 만드는 것 같지 않고 이전 인스턴스를 덮어 씁니다. 아니면 새로운 인스턴스를 만들지 만, 속성에 windowHandle-> title 값을 주면 windowHandle의 모든 인스턴스에 해당 변경 사항이 적용됩니까?
콜백 기능 :
BOOL CALLBACK delegate(HWND wnd, LPARAM param){
if (filter(wnd)){ //<- just to make sure it's kind of window that we want.
char windowName[256] = {};
GetWindowText(wnd, windowName, sizeof(windowName));
windowHandle *handle = malloc(sizeof(windowHandle)); //<- create new instance of windowHandle for each window
handle->hWND = wnd;
handle->title = windowName;
insert((windowArray*) param, handle); //<- insert each windowHandle in our 'vector'
}
// but return true here so that we iterate all windows
return TRUE;
}
전화 EnumWindows 함수 :
windowArray* array = array_init(20);
EnumWindows(&delegate, (LPARAM) array); //<- not quite sure what that '&'-sign does?
구조 :
typedef struct windowHandle{
HWND hWND;
char* title;
} windowHandle;
typedef struct windowArray{
int count;
int capacity;
int objectSize;
windowHandle* windows;
} windowArray;
그리고 마지막으로 삽입 :
int insert(windowArray* array, void* handle){
int index = (array->count * array->objectSize);
if(index > 0){
printf("\n%s %s\n", "first element's title is: ", array->windows->title); //<- prints to see if new handle overwrite the previous ones
}
printf("%s %s %s %p %s %d\n", "Inserted element ", ((windowHandle*)handle)->title, " with pointer ", handle, " on index ", index);
fflush(stdout); //<- prints info about first & current window
memcpy(array->windows + (index), (windowHandle*)handle, array->objectSize);
array->count++;
}
삽입시
출력 호출
Inserted element joo - Java - nativeWindowCapture/src/NativeWindowHookImp.c - Eclipse SDK with pointer 0000000000FB1B90 on index 0
first element's title is: Komentokehote
Inserted element Komentokehote with pointer 0000000000FB1BB0 on index 16
first element's title is: C struct instance overwrites previous instance - Stack Overflow - Mozilla Firefox
Inserted element C struct instance overwrites previous instance - Stack Overflow - Mozilla Firefox with pointer 0000000000FB1BD0 on index 32
first element's title is: JNI compiler kutsu – Muistio
Inserted element JNI compiler kutsu – Muistio with pointer 0000000000FB1BF0 on index 48
first element's title is: Skype™?
Inserted element Skype™? with pointer 0000000000FB1C10 on index 64
first element's title is: eclipse
Inserted element eclipse with pointer 0000000000FB1C30 on index 80
first element's title is: src
Inserted element src with pointer 0000000000FBCCE0 on index 96
all added
다음 내가 windowArray-> 윈도우의 전체 내용을 인쇄하는 경우, 나는 다음과 같은 결과를 얻을 :
Getting value src , at index 0 and pointer 0000000000FBBB80
Getting value src , at index 16 and pointer 0000000000FBBC80
Getting value src , at index 32 and pointer 0000000000FBBD80
Getting value src , at index 48 and pointer 0000000000FBBE80
Getting value src , at index 64 and pointer 0000000000FBBF80
Getting value src , at index 80 and pointer 0000000000FBC080
Getting value src , at index 96 and pointer 0000000000FBC180
P.S. 또한 windowArray의 windows
-attribute의 포인터가 *handle
-delegate에서 만든 객체의 포인터와 다른 이유를 알고 싶습니다. 그건 아주 효율적으로 메모리 적으로 보이지 않습니까?
오, 그 말이 맞습니다. 고맙습니다! 하루를 구했다. – user3738243