Jef*_*eff 6 stack-overflow delphi skype function
嘿SO!我在StackOverflow.com上发布了Stack Overflow问题.讽刺最好!
无论如何.我在我的SkypeReply事件处理程序上调用此过程,该事件被解雇了很多:
Procedure OnCategoryRename;
Var
CategoryID : Integer;
sCtgName : String;
Begin
if (AnsiContainsStr(pCommand.Reply,'GROUP')) and (AnsiContainsStr(pCommand.Reply,'DISPLAYNAME')) then
begin
sCtgName := pCommand.Reply;
Delete(sCtgName,1,Pos('GROUP',sCtgName)+5);
CategoryID := StrToInt(Trim(LeftStr(sCtgName,Pos(' ',sCtgName))));
sCtgName := GetCategoryByID(CategoryID).DisplayName; // Removing THIS line does not produce a Stack Overflow!
ShowMessage(sCtgName);
end;
Run Code Online (Sandbox Code Playgroud)
这样做的想法是通过我的Skype群组列表循环,以查看已重命名的群组.AFAIK并不重要,因为我的SO已被追溯到此处出现
Function GetCategoryByID(ID : Integer):IGroup;
Var
I : Integer;
Category : IGroup;
Begin
// Make the default result nil
Result := nil;
// Loop thru the CUSTOM CATEGORIES of the ONLY SKYPE CONTROL used in this project
// (which 100% positive IS attached ;) )
for I := 1 to frmMain.Skype.CustomGroups.Count do
Begin
// The Category Variable
Category := frmMain.Skype.CustomGroups.Item[I];
// If the current category ID returned by the loop matches the passed ID
if Category.Id = ID then
begin
// Return the Category as Result (IGroup)
Result := Category;
// Exit the function.
Exit;
end;
End;
End;
Run Code Online (Sandbox Code Playgroud)
当我在Result:= Category设置断点时; 和单步,这两行一遍又一遍地执行!
当我sCtgName := GetCategoryByID(CategoryID).DisplayName;
在第一个代码片段中注释掉时,没有溢出,消息显示一次应该是.但是,这GetCategoryByID
是我写的一个函数,我也编写了一个类似的函数,它工作正常(GetCategoryByName),所以我不明白为什么它决定重复
// Return the Category as Result (IGroup)
Result := Category;
// Exit the function.
Exit;
Run Code Online (Sandbox Code Playgroud)
一遍又一遍地.
如果您需要更多信息,请不要犹豫!
编辑:以下是如何重现它:https://gist.github.com/813389
编辑:这是我的CallStack,按要求:
Edit2:更多信息:
谢谢你的时间! - 杰夫
确保编译项目时关闭"优化","堆栈帧"和"使用debug .dcu",以获得最详细的callstack.然后发布你在这里遇到堆栈溢出时得到的callstack(如果你无法从中识别出问题的本质).
您的问题中没有显示的内容:您在此处发布的“OnCategoryRename”函数是从“TForm.Skype1Reply”回调调用的子函数。
为了看到这一点,我必须点击你的 github 链接 - 但我认为这是你问题的一个重要点。
我猜 :
我认为一个快速而肮脏的解决办法是改变
sCtgName := GetCategoryByID(CategoryID).DisplayName; // Removing THIS line does not produce a Stack Overflow!
Run Code Online (Sandbox Code Playgroud)
和
sCtgName := //find another way to get the new name, which you can probably get from your ICommand object
pCommand.Reply.ReadDataFromReplyAndGetNewDisplayName;
Run Code Online (Sandbox Code Playgroud)
将来,我建议您发布此类问题的完整代码示例。