From 876ed6e76cdbd743837ee4f5951418ecc604ab12 Mon Sep 17 00:00:00 2001
From: "SND\\ussrhero_cp"
 <SND\ussrhero_cp@9b283d60-5439-405e-af05-b73fd8c4d996>
Date: Sun, 8 Jan 2017 22:58:31 +0000
Subject: [PATCH] [0.3.x] added : sample with a class method call

git-svn-id: https://pykd.svn.codeplex.com/svn@91110 9b283d60-5439-405e-af05-b73fd8c4d996
---
 samples/um/stdstring.py | 37 +++++++++++++++++++++++++++++++++++++
 1 file changed, 37 insertions(+)
 create mode 100644 samples/um/stdstring.py

diff --git a/samples/um/stdstring.py b/samples/um/stdstring.py
new file mode 100644
index 0000000..f2f4480
--- /dev/null
+++ b/samples/um/stdstring.py
@@ -0,0 +1,37 @@
+
+import pykd
+
+#it's exact name of the std::string class. We need it later.
+stringClassName = "basic_string<char,std::char_traits<char>,std::allocator<char> >"
+fullStringClassName = "std::" + stringClassName
+
+# get a malloc function. May be we have not its prototype in pdb file, so we need to define prototype manually
+PVoid = pykd.typeInfo("Void*")
+size_t = pykd.typeInfo("Int8B") if pykd.getCPUMode ==  pykd.CPUType.AMD64 else pykd.typeInfo("Int4B")
+mallocProto = pykd.defineFunction( PVoid, pykd.callingConvention.NearC )
+mallocProto.append("size", size_t)
+
+malloc = pykd.typedVar(mallocProto, pykd.getOffset("malloc") ) #getOffset("malloc") may take a long time
+
+# get a type of a std::string
+stringClass = pykd.typeInfo(fullStringClassName)
+ 
+# allocate memory
+buffer = malloc( stringClass.size() )
+
+# get a typed access to memory. As you may see the instance of the std::string is not initialized
+stringVar = pykd.typedVar( stringClass, buffer )
+
+# set up parameters for a constructor call.
+param = pykd.stackAlloc(100)
+
+pykd.writeCStr(param, "hello")
+
+# call ctor for initalizing. std::string has some form of constructor so we need note prototype
+ctor = stringVar.method( stringClassName, "Void(__thiscall)(Char*)" )
+ctor(param)
+
+#check result:
+print( pykd.loadCStr( stringVar.c_str() ) )
+
+pykd.stackFree(100)