2013-02-04 3 views
2

C++을 사용하여 Excel XLL 추가 기능을 작성하고 있습니다. 여기에서 함수는 미리 정의 된 XLOPER12를 사용하여 Excel로 문자열을 반환합니다.메모리 누수없이 Excel에 문자열을 반환하는 Excel C 추가 기능을 작성하는 방법은 무엇입니까?

필자가 이해했듯이 Excel은 메모리를 가리키는 포인터를 반환하는 함수가 필요하며 함수에 할당 된 메모리를 지우지 않고 얕은 복사본을 만듭니다. 그래서 내가 다음과 같이 쓴다면 :

extern "C" LPXLOPER12 WINAPI strgen() { 
    XLOPER12 res; 

    res.xltype = xltypeString; 
    res.val.str = (XCHAR*)malloc(2*sizeof(XCHAR)); 
    res.val.str[0] = (XCHAR)1; 
    res.val.str[1] = L"X"; 

    return (LPXLOPER12)&xRes; 
} 

분명히 이것은 메모리 누수의 원인이 될 것입니다. 누군가는 res를 정적 변수로 선언 할 수 있다고 제안하지만 실제로 초기화하는 방법을 모른다.

모든 제안을 환영합니다.

최저

+0

샘플 코드도 대답도 좋지 않습니다. 두 경우 모두'res'가 스택에 선언되고 주소가 반환됩니다. 가장 좋은 경우에는 충돌이 발생하고 (문제가 있음을 즉시 알 수 있기 때문에) 최악의 경우에 합리적인 결과가 발생합니다 (코드에서 문제이므로 즉시 잡히지 않습니다). – prprcupofcoffee

+0

@David 나는 그 문제를 발견했기 때문에 대답을 편집한다. BTW는 원래 코드에서 일부'xRes' 주소를 반환합니다. 난 그게 뭔지 모르겠다 – borisbn

+0

메모리 관리는 여기에 문서화되어 있습니다 : http://msdn.microsoft.com/en-us/library/office/bb687840.aspx – indiv

답변

2

문제를 해결하고 https://xll.codeplex.com을 사용하십시오. 기능을 등록하고 정의하는 완전한 코드는

static AddIn12 xai_strgen(
    L"?strgen", L"STRGEN", 
    XLL_LPOPER12, L""); 
LPOPER12 WINAPI strgen() 
{ 
#pragma XLLEXPORT 
    static XLOPER12 xRes(L"X"); 

    return &xRes; 
} 
0
당신은 정적 배열을 선언하고 그것이 스택 저장을해야합니다 때문에, 함수 내에서 s_res 이동 안되는주의를 기울 주소

XCHAR s_res[3] = {0}; 
XLOPER12 res; 
extern "C" LPXLOPER12 WINAPI strgen() { 


res.xltype = xltypeString; 
res.val.str = (XCHAR*)s_res; 
res.val.str[0] = (XCHAR)1; 
res.val.str[1] = L"X"; 

return (LPXLOPER12)&res; 
} 

의 반환을 시도 할 수

, 그 함수가 반환 될 때 지워집니다.

+0

고마워요,하지만 여전히 스레드 안전하지 않은 것 같습니다. 나는 방금 xlAutoRemove 함수 호출을 통해 이것을 할 수 있다는 것을 msdn에서 배웠다 ... – yuez

+0

IMHO 당신은 대답으로 그의 코멘트를 만들고 그것을 받아 들여야한다. – borisbn

+0

미안하다. 나는 이것을 받아 들일 수있다. 나는 어떻게 받아 들일 수 있는가? 대답으로? – yuez