C#中怎样获取函数的内存地址

qygcom 2008-05-20 03:51:06
例如:我怎么能取到Messagebox.Show("aaaa");这句话的内存地址
...全文
881 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
qygcom 2008-05-23
  • 打赏
  • 举报
回复
35楼,voice.Speak是根据文字,从语音库调用语音数据,输出的是语音数据,所以才听到了声音,SsmPlayMem函数要是处理多种形式的语音数据,我那个就能实现,如果它只处理到保存语音数据的文件,那你的说法就正确,我没试过,不清楚,不想在这个问题上花时间了,谢谢您的帮助及指点,给您加50分,再次感谢各位的帮助.
DNN-2017 2008-05-22
  • 打赏
  • 举报
回复
顶一个
富莱工作室 2008-05-22
  • 打赏
  • 举报
回复
请问怎么能取到voice.Speak(richTextBox1.Text, spFlags);这句话的地址,然后把地址转成byte[]型代到那个函数里。

你是想
SsmPlayMem(ch, nFormat, voice.Speak(richTextBox1.Text, spFlags),......)
这样吗?

voice.Speak(...) 返回什么值?
qygcom 2008-05-22
  • 打赏
  • 举报
回复
SsmPlayMem是C++写的,
函数原型:int SsmPlayMem(int ch, int nFormat, LPBYTE pBuf, DWORD dwBufSize, DWORD dwStartOffset, DWORD dwStopOffset) 第三个参数的定义为: typedef BYTE far *LPBYTE;

C#引用改为:[DllImport("SHP_A3.dll")]
public static extern int SsmPlayMem(int ch, int nFormat, byte[] pBuf,
uint dwBufSize, uint dwStartOffset, uint dwStopOffset);

看在11楼提出的问题.
富莱工作室 2008-05-22
  • 打赏
  • 举报
回复
IL指令:
IL_XXXX: call int voice.Speak(...);

你期望将上面的指令在进程空间中地址传给SsmPlayMem(...)?

实在没什么用, 好象?
富莱工作室 2008-05-22
  • 打赏
  • 举报
回复
呵, 更加看不懂了, 不好意思

SsmPlayMem 的第三个参数byte[] pBuf, 应该是音频数据吧
而你把voice.Speak(richTextBox1.Text, spFlags);这句话的地址, 传给SsmPlayMem(....), 有什么用, 呢它又不是音频数据?

按我的想法, voice.Speak(richTextBox1.Text, spFlags)应该要返回Byte[], 表示文本对应的声音流,
或者, 你返回BOOL或INT, 那么应修改为:voice.Speak(richTextBox1.Text, spFlags, out Byte[] buf)之类的方式,
将音频数据通过参数传出来,
然后, SsmPlayMem(...,buf,...);

你始终要求将voicie.Speak的代码地址(可以这样理解吗?)做为Byte[]参数, 实在让人不解

你在11楼所说的, 我都看过了, 只是没看明白而已

我想请问你, voice.Speak(...), 这个函数将文本转成语音数据吗, 你转完后, 音频数据都放在哪?
qygcom 2008-05-22
  • 打赏
  • 举报
回复
32楼,跟返回什么值没关系(上面我已说过),返回整型,0表示失败 1表示成功,11楼里我已说了,要返回那句话的地址,因为第三个参数是缓存地址,11楼里那个说的就详细了。
卧_槽 2008-05-21
  • 打赏
  • 举报
回复
GetHash()
返回的是地址。
诸法空性 2008-05-21
  • 打赏
  • 举报
回复
Type ty = MessageBox.Show("erererer").GetType();
System.Reflection.MethodInfo[] methods = ty.GetMethods();
MessageBox.Show(methods[0].MethodHandle.Value.ToString());

我通过反射找到了该方法的“句柄”,但因为不知道什么是句柄,只好到这里停下了。显示出来得东西会有一串数字,不知道是不是地址。
qygcom 2008-05-21
  • 打赏
  • 举报
回复
最近我天天都会来看帖子,除非我结贴了,有正确答案我肯定给分的.
qygcom 2008-05-21
  • 打赏
  • 举报
回复
17楼的朋友,我不是想用SsmPlayMem来替代voice.Speak来播放声音,voice.Speak是把字符串变成了声音,SsmPlayMem是语音卡内存放音函数,您那个不行啊!郁闷大家还以为我不给分,实在是没有正确答案啊!
r_swordsman 2008-05-21
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 qygcom 的回复:]
文字转成语音,三句话。
SpeechVoiceSpeakFlags spFlags = SpeechVoiceSpeakFlags.SVSFlagsAsync;
SpVoice voice = new SpVoice();
voice.Speak(richTextBox1.Text, spFlags);

内存放音函数:

函数原型:
int SsmPlayMem(int ch, int nFormat, LPBYTE pBuf, DWORD dwBufSize, DWORD dwStartOffset, DWORD dwStopOffset)

第三个参数为 存放语音数据的缓冲区地址。
请问怎么能取到v…
[/Quote]

你就是想用SsmPlayMem来替代voice.Speak来播放声音吧?
但是你不知道怎么把字符串转换为BYTE[],可以用 System.Text.Encoding 类的GetBytes 方法


byte[] bytes = System.Text.Encoding.Unicode.GetBytes( "abcdefg" );

富莱工作室 2008-05-21
  • 打赏
  • 举报
回复
这好象只是个语言互操作的问题,
SsmPlayMem是用C或C++写的吧,
C#引用这个函数是, 修改下函数原型不就可以了?
qygcom 2008-05-21
  • 打赏
  • 举报
回复
24楼的朋友您给我的代码执行后结果为:2066148488,这个还行,不过普通方法能实现了,我那个用您这实现很困难,我给您50分吧.谢谢.不过现在结不了帖,等下星期一我一并给您结.
qygcom 2008-05-21
  • 打赏
  • 举报
回复
24楼的朋友您给我的代码执行后结果为:2066148488,这个还行,不过普通方法能实现了,我那个用您这实现很困难,我给您50分吧.谢谢.
smartstar2005 2008-05-21
  • 打赏
  • 举报
回复
Mark
诸法空性 2008-05-21
  • 打赏
  • 举报
回复
哈,还真是,谢谢25楼。
24楼的我执行不了,出错。
qygcom 2008-05-21
  • 打赏
  • 举报
回复
21楼的朋友,句柄一般情况下是操作系统为窗体(也会给画笔,刷子...)分配的ID编号,不是那句化的地址,你程序执行后显示的是
2032379936,我CPU是32位的,只会出现8位的十六进制数,例如:0x03e0e534, 不会出现你那中数字的.
王集鹄 2008-05-21
  • 打赏
  • 举报
回复
using System.Reflection;

private void button1_Click(object sender, EventArgs e)
{
MethodInfo mi = typeof(MessageBox).GetMethod("Show", new Type[] { typeof(string) });
Console.WriteLine(mi.MethodHandle.GetFunctionPointer());
}
yilanwuyu123 2008-05-21
  • 打赏
  • 举报
回复
UP一下 期待高人
加载更多回复(16)

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧