我通常是一名Java程序员,我的C ++日子已经结束至少15年了。现在我使用C ++为一些Win32函数构建一个桥(dll)。
问题仍然存在,我什么时候必须发布从Win32调用中获取的字符串等?
例如:User32.dll => WINUSERAPI UINT WINAPI RealGetWindowClassA(__in HWND hwnd, __out_ecount_part(cchClassNameMax, return) LPSTR ptszClassName, __in UINT cchClassNameMax);
。它给了我一个指向类名的指针,我只是使用JNA将它映射到char []。复制后我是否需要处理它?</ p>
是否有任何提示和释放/ dealloc / dispose(?)/ delete / free?
[更新]
正如technomage已经指出的那样,这个例子是关于拥有被移交的缓冲区。但一般的问题是我何时必须处理它,什么时候不处理?我可以遵循任何语法或提示吗?
为您提供一个额外的示例,获取一个接口(ISomething)并获取其中一个属性。通常一个双指针(ppVariable),因此它可以写入一个指针值作为操作的结果。有一次,我看到SysFreeString
跟进的跟进电话。所以我想在使用它之后我必须释放它。
关于这个的任何想法?如何处理?
此外,我从未见过窗口句柄被处理掉(至少在我的代码中没有)。这有什么规则?
答案 0 :(得分:0)
您正在将缓冲区传递给本机函数并告知缓冲区的大小。这允许被调用函数将数据复制到缓冲区,而不必担心分配内存。
您已拥有缓冲区,因此适用普通的Java规则。
顺便说一句,如果您需要byte[]
使用-A
函数,char[]
使用-W
函数。该“out”参数是使用LPTSTR
定义的,因此您需要相应地选择字符串类型。