VB 응용 프로그램에서 C DLL의 사용자 목록을 요청하고 있습니다.
VB에서 DLL을 몇 명의 사용자에게 물어보고 적절한 크기로 배열을 초기화합니다.
VB는 DLL 함수를 참조하여 해당 배열을 전달합니다.이 함수는 사용자 이름으로 채 웁니다.C- 문자열 배열에 대한 포인터를 선언 할 때 몇 개의 별표를 사용해야합니까?
다음과 같이 C 함수를 작성하기 시작했습니다 : foo(char **bar);
이는 문자열 배열로 처리됩니다. 그러나 나는 이미 가리키고있는 데이터를 수정하기보다는 어레이 포인트의 각 항목을 다른 C- 문자열 (char *username
링크 된 목록의 struct userlist
) 목록으로 만들 예정입니다. 배열의 배열은 값에 의해 전달되고 있습니다 : 주소 목록은 복사본이 원래 데이터를 가리 키지 만 그 복사본의 주소는 호출자의 주소 목록을 변경하지 않습니다 (어쨌든 생각합니다.)). 그럼, 내가 그것을 foo(char ***bar);
이라고 선언해야합니까? 이것은 문자열 배열에 대한 포인터가 될 것이므로 배열이 가리키는 문자열을 변경하면 호출자 (VB)가 사용하고있는 문자열 배열이 수정됩니다.
이 내 사용 지금까지입니다
EXPORT void __stdcall update_userlist(char ***ulist){
int i = 0;
userlist *cur_user = userlist_head; //pointer to first item in linked list
for(; i < usercount_; ++i){
*ulist[i] = cur_user->username;
cur_user = cur_user->next;
}
}
잘 VB는 SAFEARRAY 포인터를 기대하는 C 함수에 대한 참조를 전달하면, 내가 그런 식으로 조작 할 수 있습니까? 그리고 VB 배열에 DLL 번호를 미리 요청하여 적절한 수의 요소가 포함되어 있는지 확인한 다음 배열을 반복하고 항목을 변경하면됩니다. Longs의 VB 배열에 대해 언급 한 것이 간단하다면 BSTR이 실제로 char *이므로 String 배열도 작동합니다. 나는 규칙적인 위험한 배열을 사용하고 두 호출을하는 것이 SAFEARRAY를 만드는 것보다이 프로그램의 단순성에 더 적합하다고 생각한다. –
... 내 주요 문제는 VB 배열의 문자열을 수정할 수있다. char **에 전달하지만 실제 배열을 값으로 전달하고 참조로 만 문자열을 전달하지 않을까요? 이렇게하면 배열의 복사본을 변경하는 것이므로 원본과 복사가 모두 가리키는 데이터가 아니라 다른 배열을 가리 키도록 배열을 리디렉션 할 수 없게됩니다. –
아니요, 맞아요, 문자열을 전달할 수 없으며, 필수 유형 만 ...thanks –