2011-09-12 44 views
2

我一直试图让这个工作适合年龄段,但没有用(悲伤的脸)。从编辑控件(纯Win32 API)中获取文本

int iChars = GetWindowTextLength (GetDlgItem(handle,ID))+1; // Room for '\0' 
char* pstrText; 
pstrText = (char*) malloc (sizeof(char)*iChars); 
if (pstrText != NULL) { 
    //GetWindowText (GetDlgItem(handle,ID), pstrText, iChars); 
     GetDlgItemText(handle,ID,pstrText,iChars); 
} 
return pstrText; // Memory gets freed after it returns 

工作例如:

char* MWC::System::TextBox::GetText(){ 
    int len = SendMessage(handle, WM_GETTEXTLENGTH, 0, 0); 
    char* buffer = new char[len]; 
    SendMessage(handle, WM_GETTEXT, (WPARAM)len+1, (LPARAM)buffer); 
    return buffer; 
} 
+0

即使您对指针进行反思,内存仍会被删除,因此结果仍然会指向已删除的内存。此外,根据您正在运行的平台,指针的大小将为32/64位。函数GetDlgItemText的Fouth参数必须是iChars。 – beren

+0

是啊,那不是什么导致功能不能正常工作。 – Christian

+1

“不工作”对我们来说不够好。它是如何失败的。准确。我们无法看到您的屏幕。 –

回答

6

wParam参数是错在这里:

SendMessage(handle, WM_GETTEXT, (WPARAM)len, (LPARAM)buffer); 

你应该通过len+1因为零终止。

+0

谢谢大卫,再次...^_ ^ – Christian

3

返回之前,您释放内存!

if ((pstrText != NULL) { 
    GetDlgItemText(handle,ID,pstrText,sizeof(pstrText)); 
    free (pstrText); // Freeing memory Here! 
} 

您必须提供当其不再需要客户端释放的方式...

希望这有助于!

+0

好的谢谢!由于pstrText是一个局部变量,它的内存应该在函数返回后清除(right?)。我删除了免费(pstrText),但现在程序没有任何返回。 – Christian

+0

pstrTest是一个局部变量。变量在超出范围时被破坏,但内存保持分配状态直到您在该内存中调用free()。当不再需要时,你必须找出一种方法来释放内存。 – beren

+0

第二个例子呢?它什么也没有返回! – Christian

2

在返回之前,您已经释放了由pstrText指向的内存。您应该返回一个字符串对象,该对象实际上可以包含文本并在发布时自动释放它。或者你必须要求调用者为字符串分配内存,但是你只是包装API。

+0

感谢您注意:P,但问题仍然存在! – Christian

+0

读取/显示/复制之后,您需要释放'pstrText'(否则您将发生内存泄漏)。在继续之前,我认为你会更好地学习一些C/C++内存基础知识。 – demorge

+0

这是一个临时变量,所以内存在函数返回后被删除。 – Christian