SORU
6 Mart 2009, Cuma


C geçersiz bir işlev çağrısı

Aramalar günlüğü uğruna birçok API için bazı işlev çağrıları geçersiz kılmak istiyorum, ama aynı zamanda gerçek işlevi için gönderilmeden önce verileri işlemek isteyebilirsiniz.

Örneğin, benim kaynak kodu bir fonksiyon getObjectName denilen binlerce kez kullanıyorum diyelim. Bu işlevin davranışı farklı sonucunu görmek için değiştirmek istiyorum, çünkü bu işlev geçici olarak geçersiz kılmak için bazen istiyorum.

Yeni bir kaynak böyle dosya: ben oluşturmak

#include <apiheader.h>    

const char *getObjectName (object *anObject)
{
    if (anObject == NULL)
        return "(null)";
    else
        return "name should be here";
}

Ben her zamanki gibi tüm diğer kaynak derleme, ama ilk API kütüphanesi ile bağlantı önce bu fonksiyonu karşı link. Bu tabii ki öncelikli görevim içinde gerçek işlevi arayamam dışında gayet iyi çalışıyor.

"Bağlama/derleme hataları/uyarılar olmadan mı?" bir işlevi geçersiz kılmak için daha kolay bir yoldur İdeal sadece derleme ve fazladan bir ya da iki dosya bağlayarak işlevi geçersiz kılmak mümkün oldukça çok seçenek bağlama ya da gerçek kaynak benim program kodu değiştirme ile uğraşmak istiyorum.

CEVAP
6 Mart 2009, Cuma


Linux altında gcc ile, bu gibi --wrap linker bayrağı kullanabilirsiniz:

gcc program.c -Wl,-wrap,getObjectName -o program

ve fonksiyon olarak tanımlayın:

const char *__wrap_getObjectName (object *anObject)
{
    if (anObject == NULL)
        return "(null)";
    else
        return __real_getObjectName( anObject ); // call the real function
}

Bu getObjectName() tüm aramalar için sarıcı fonksiyon (bağlantı) için yönlendirilir emin olun. Çok yararlı bu bayrak, Mac OS X altında gcc ancak yok

Eğer g da derleme iseniz extern "C" sarıcı işlev bildirmek için unutma.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Elly

    Elly

    3 EKİM 2005
  • HowcastTechGadgets

    HowcastTechG

    22 EYLÜL 2010
  • Liberator

    Liberator

    14 EYLÜL 2007