例如:我怎么能取到Messagebox.Show("aaaa");这句话的内存地址

解决方案 »

  1.   

    我要调用一个放音函数,这个函数中有个参数,是存储放音数据的缓存区地址,我正好有句话,实现了这功能,但它返回0或1,我不关心他返回什么,只要取到这句话的地址,地址是byte[]型的.然后代到那个放音函数里就可以了.
      

  2.   

    你先定义一个托管,然后将MessageBox.Show赋值给这个托管
    然后用
    Marshal.GetFunctionPointerForDelegate
    得到一个函数指针,
    通常这个函数指针就是函数地址了.
      

  3.   

    6楼,您可能说的应该是个委托,就是delegate 命名的那种,取不到,那只是对方法的引用.
      

  4.   

    然后对委托调用Marshal.GetFunctionPointerForDelegate 也不行么?
      

  5.   

    文字转成语音,三句话。
    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)第三个参数为 存放语音数据的缓冲区地址。
    请问怎么能取到voice.Speak(richTextBox1.Text, spFlags);这句话的地址,然后把地址转成byte[]型代到那个函数里。语言请用C#,有知道的朋友吗?
      

  6.   

    没看明白,麻烦看明白的解释一下
    楼主的"只要取到这句话的地址" 中的"地址"是不是一个函数在代码区的地址呀?
    如果是.怎么把它变成byte[] 型,byte[]型只能是对堆区的引用,怎么可能把一个代码区的地址给它呢?
    如果不是.那是什么?
      

  7.   

    Prototype Definition
    int WINAPI SsmPlayMem(int ch, int nFormat, LPBYTE pBuf, DWORD dwBufSize, DWORD dwStartOffset,
    DWORD dwStopOffset)
    Parameter
    ch
    channel number
    nFormat
    encoding format of play data, valid value:-1 (default play coding format in hardware channels is adopted, which
    can be set in configuration file of hardware DLL), 6(A-LAW), 7(μ-LAW), 17( IMA ADPCM) and 85(MP3, only for
    MP3 record board)
    pBuf
    pointer to initial address of record buffer areadwBufSize
    size of play data buffer area(bytes)
    dwStartOffset
    offset of initial play position in play buffer area
    dwStopOffset
    offset of ending play position in the buffer area, if the parameter is more than or equal to size of buffer area, the
    buffer area is circularly played.这个说第三个参数是语音数据的开始地址跟那个函数地址没有关系吧.
      

  8.   

    刚才看了一下
    你应该用SpVoice的AudioOutputStream属性得到输出的音频流然后在放到SsmPlayMem的第三个参数才可以
      

  9.   


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

  10.   

    17楼的朋友,我不是想用SsmPlayMem来替代voice.Speak来播放声音,voice.Speak是把字符串变成了声音,SsmPlayMem是语音卡内存放音函数,您那个不行啊!郁闷大家还以为我不给分,实在是没有正确答案啊!
      

  11.   

                Type ty = MessageBox.Show("erererer").GetType();
                System.Reflection.MethodInfo[] methods = ty.GetMethods();
                MessageBox.Show(methods[0].MethodHandle.Value.ToString());我通过反射找到了该方法的“句柄”,但因为不知道什么是句柄,只好到这里停下了。显示出来得东西会有一串数字,不知道是不是地址。
      

  12.   

    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());
    }
      

  13.   

    21楼的朋友,句柄一般情况下是操作系统为窗体(也会给画笔,刷子...)分配的ID编号,不是那句化的地址,你程序执行后显示的是
    2032379936,我CPU是32位的,只会出现8位的十六进制数,例如:0x03e0e534,   不会出现你那中数字的.
      

  14.   

    这好象只是个语言互操作的问题, 
    SsmPlayMem是用C或C++写的吧,
    C#引用这个函数是, 修改下函数原型不就可以了?
      

  15.   

    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楼提出的问题.
      

  16.   

    请问怎么能取到voice.Speak(richTextBox1.Text, spFlags);这句话的地址,然后把地址转成byte[]型代到那个函数里。你是想
    SsmPlayMem(ch, nFormat, voice.Speak(richTextBox1.Text, spFlags),......)
    这样吗?voice.Speak(...) 返回什么值?
      

  17.   

    呵, 更加看不懂了, 不好意思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(...), 这个函数将文本转成语音数据吗, 你转完后, 音频数据都放在哪?
      

  18.   

    IL指令:
    IL_XXXX:  call  int voice.Speak(...);你期望将上面的指令在进程空间中地址传给SsmPlayMem(...)?实在没什么用, 好象?
      

  19.   

    35楼,voice.Speak是根据文字,从语音库调用语音数据,输出的是语音数据,所以才听到了声音,SsmPlayMem函数要是处理多种形式的语音数据,我那个就能实现,如果它只处理到保存语音数据的文件,那你的说法就正确,我没试过,不清楚,不想在这个问题上花时间了,谢谢您的帮助及指点,给您加50分,再次感谢各位的帮助.