当前位置:  技术问答>linux和unix

怎样写脚踩两条船(cygwin和Win32本地API结合)的程序?

    来源: 互联网  发布时间:2016-09-08

    本文导语:  要写一个程序,它通过cygwin的fwrite、fread等函数,输入输出,并可以通过mintty等tty显示utf-8,但程序本身是一个Windows程序,即它是通过VC开发的,且要调用Win32的API做其他事情。 怎么弄? | cygl...

要写一个程序,它通过cygwin的fwrite、fread等函数,输入输出,并可以通过mintty等tty显示utf-8,但程序本身是一个Windows程序,即它是通过VC开发的,且要调用Win32的API做其他事情。

怎么弄?

|
cygload.h:


// cygload.h                                      -*- C++ -*-
//
// Copyright 2005, Red Hat, Inc.
//
// Written by Max Kaehn 
//
// This software is a copyrighted work licensed under the terms of the
// Cygwin license.  Please consult the file "CYGWIN_LICENSE" for details.
//
// Note that dynamically linking to cygwin1.dll automatically places your code
// under the GPL unless you purchase a Cygwin Contract with Red Hat, Inc.
// See http://www.redhat.com/software/cygwin/ for more information.

// This program has large numbers of progress messages so as to provide
// maximum information about crash locations for anyone without access to
// a Microsoft debugger.


// This file contains the basic infrastructure for connecting an MSVC
// process to Cygwin.

#ifndef __CYGLOAD_H__
#define __CYGLOAD_H__

#include             // for GetProcAddress()
#include            // for pointer_to_unary_function
#include             // for runtime_error
#include 
#include 
#include 

// Convert GetLastError() to a human-readable STL exception.
class windows_error : public std::runtime_error
{
public:
  windows_error (const char *message, const char *detail = NULL)
    : runtime_error (format (GetLastError (), message, detail)) { }
  windows_error(DWORD error, const char *message, const char *detail = NULL)
    : runtime_error (format (error, message, detail)) { }

  static std::string format (DWORD error, const char *message,
                             const char *detail);
};

namespace cygwin
{

  // Cygwin keeps important thread-local information at the top of the
  // stack.  Its DllMain-equivalent will do the right thing for any threads
  // you spawn, but you need to declare one of these as the very first thing
  // in your main() function so horrible things won't happen when cygwin
  // overwrites your stack.  This will back up the data that will be
  // overwritten and restore it when the destructor is called.
  class padding {
  public:
    padding ();
    ~padding ();

    // Verifies that padding has been declared.
    static void check ();

  private:
    std::vector _backup;
    char *_stackbase, *_end;

    // gdb reports sizeof(_cygtls) == 3964 at the time of this writing.
    // This is at the end of the object so it'll be toward the bottom
    // of the stack when it gets declared.
    char _padding[32768];

    static padding *_main;
    static DWORD _mainTID;
  };

  // This hooks your application up to cygwin:  it loads cygwin1.dll,
  // initializes it properly, grabs some important symbols, and
  // spawns a thread to let you receive signals from cygwin.
  class connector {
  public:
    connector (const char *dll = "cygwin1.dll");
    ~connector ();

    // A wrapper around GetProcAddress() for fetching symbols from the
    // cygwin DLL.  Can throw windows_error.
    template  void get_symbol (const char *name, T &fn) const;

    // Wrappers for errno() and strerror().
    int err_no () const;
    std::string str_error (int) const;

    // Converting between the worlds of Windows and Cygwin.
    std::string unix_path (const std::string &windows) const;
    std::string win_path (const std::string &unix) const;

  private:
    HMODULE _library;

    int *(*_errno) ();
    const char *(*_strerror) (int);
    void (*_conv_to_full_posix_path) (const char *, char *);
    void (*_conv_to_full_win32_path) (const char *, char *);

  public:
    // The constructor will automatically hook you up for receiving
    // cygwin signals.  Just specify a signal and pass in a signal_handler.
    typedef std::pointer_to_unary_function signal_handler;
    signal_handler *set_handler (int signal, signal_handler *);

  private:
    // Cygwin signals can only be received in threads that are calling
    // interruptible functions or otherwise ready to intercept signals, so
    // we spawn a thread that does nothing but call sigwait().

    // This is the entry point:
    static DWORD WINAPI signal_thread (void *);
    // It runs this:
    void await_signal ();
    // And will execute this on receipt of any signal for which it's
    // registered:
    void handle_signals (int);

    HANDLE _signal_thread;
    bool _waiting_for_signals, _signal_thread_done;
    CRITICAL_SECTION _thread_mutex;

    typedef std::map callback_list;
    callback_list _signal_handlers;
  };

  template  void connector::get_symbol (const char *name,
                                                 T &symbol) const
  {
    FARPROC retval = NULL;

    retval = GetProcAddress (_library, name);

    if (retval == NULL)
      throw windows_error ("GetProcAddress", name);

    symbol = reinterpret_cast  (retval);
  }

  // cygwin::error converts errno to a human-readable exception.
  class error : public std::runtime_error
  {
  public:
    error (connector *c, const char *function, const char *detail = NULL)
      : runtime_error (format (c, c->err_no (), function, detail)) { }
    error (connector *c, int err_no, const char *function,
           const char *detail = NULL)
      : runtime_error (format (c, err_no, function, detail)) { }

    static std::string format(connector *c, int err_no,
                              const char *message, const char *detail);
  };
}

#endif // __CYGLOAD_H__


    
 
 

您可能感兴趣的文章:

  • 在windows下装了cygwin以后可否进行linux程序的编写
  • php iis7站长之家
  • 在cygwin编译驱动程序要不要交叉编译?
  • 急!使用WINXP+Cygwin写进程控制程序中一个小问题
  • 急问:用Cygwin编译Linux程序后生成的.out文件可以在Linux操作系统上跑吗?
  • 急!!!!windows下安装的cygwin 如何运行java程序???????
  • 请教cygwin编译源程序问题!
  • windows下用cygwin来编译linux下的程序,怎么会不成功?
  • CYGWIN 如何输出可发布程序
  • 我在cygwin里运行自己的程序结果不能print出来。然而在WIN_TC里却可以。这是为什么?
  • 急…Cygwin下编译含bool型C子程序为什么出错?
  • 麻烦大家看看这个cygwin的编译的c程序怎么有这些错误?
  • 一个串口通讯的程序,流程没有问题,程序在Linux下运行就死循环,在Cygwin下就好使?
  • 请问有人帮忙用cygwin编译一下下面的程序看是否能通过
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • cygwin在WIN2000下的问题
  • vista&win7 cygwin编译不过
  • 在cygwin下运行openvpn,exe找不到tap-win32设备是为什么?
  • 我在win2k下装了cygwin,后来卸载了它。但是有几个文件无论如何都删不掉,请问如何处理?
  • 关于cygwin
  • 使用cygwin的问题
  • 重装了系统,在其他分区的cygwin如何正常工作?
  • cygwin与虚拟机下装linux有什么区别?
  • 在cygwin上可以编写vc用的dll吗?
  • cygwin的安装问题!
  • 有用过cygwin的么?
  • 关于Cygwin.
  • 想在cygwin下面安装tar
  • 请问cygwin怎么登录?装完之后,它没让我设置root密码!!
  • 安装的cygwin不能用
  • 请问哪有cygwin的教程啊?
  • 安装cygwin为什么没有X11R6这个目录
  • 一个让我炸掉的cygwin问题
  • cygwin: can not execute binary file
  • 如何在cygwin下安装gcc
  • 如何删除cygwin
  • 在cygwin中编译c,结果打不开stdio.h,如何解决!
  • 新手提问,请前辈们指教(关于cygwin)!
  • 哪儿有cygwin的下载


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3