我爱builder

C++Builder 程序员博客

BCB如何调用WINPCAP?
我们老师要我用BCB写一个抓包的程序,要用到winpcap.请问BCB是怎么调用winpcap的啊!或许我的提问方式不恰当。总之,BCB怎么和winpcap发生关系的啊?我们老师给我了一个用VC写的抓包程序的源代码,请问对我们有多大的参考价值啊?谢谢!

下面是我在百度上面提问时他们给我的答案,可我就是看不懂
“VC中写的代码不需要大的修改就可以在BCB中运行, 但是由于原有的lib是为VC++写的,所以建议用BCB的implib工具重新生成BCB可用的LIB文件,并将其导入你的BCB工程中并将需要的DLL文件复制到工程的DEBUG目录或者RELEASE目录中,包含头文件,然后可以调用WINPCAP API写程序。 当然,前提是已经安装了WINPCAP”

谢谢!!!

还有,我直接把下面的程序放在BCB控制台上调试,怎么编译时说找不到 <pcap.h>
#include <pcap.h>
#include <stdlib.h>
#include <stdio.h>
#pragma comment(lib,"wpcap.lib")
int main(int argc, int argv[])
{
    pcap_if_t *alldevs;
    pcap_if_t *d;
    int i=0;
    char errbuf[PCAP_ERRBUF_SIZE];
   
    /* Retrieve the device list from the local machine */
    if (pcap_findalldevs(&alldevs, errbuf) == -1)
    {
        fprintf(stderr,"Error in pcap_findalldevs_ex: %s\n", errbuf);
        exit(1);
    }
   
    /* Print the list */
    for(d= alldevs; d != NULL; d= d->next)
    {
        printf("%d. %s\n", ++i, d->name);
        if (d->description)
            printf(" (%s)\n", d->description);
        else
            printf(" (No description available)\n");
    }
   
    if (i == 0)
    {
        printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
  return 0;
}
      return -1;
    }
    /* We don't need any more the device list. Free it */
    pcap_freealldevs(alldevs);
我到底怎么做才能调用WINPCAP啊?谢谢!!!

这种标准的C程序在CB和VC里都是一样的

Winpcap使用C写的,VC和BCB的使用方法一样。

能不能讲的再详细一点啊?我没有学过VC,BCB也只是学了一学期钱能的书,知识太有限了,让大家见笑了。

你google肯定能找到一大片代码的,照着用就是了

  • Filed under: C++ Builder
  • 如何使用ShellExecute调用外部程序, 只能运行一次,再次调用时,显示已经调用过的窗口.
    HANDLE mutex ;
        const char mutexname [] = "EEGSysSet" ;
        mutex = OpenMutex (0, false, mutexname) ;//
        if (mutex == NULL)
        {
            mutex = CreateMutex(0,1,mutexname);
            if(!ERROR_ALREADY_EXISTS == ::GetLastError())
            {
                AnsiString          ans;
                ans.sprintf("%s\\EEGSysSet.exe", CDBIN);
                ShellExecute(NULL, "", ans.c_str(), "EEGSys", CDBIN, SW_MAXIMIZE);
            }
        }
        else
        {
            ShowMessage ("Application Already Running") ;
        } *
    使用以上程序,创建CreateMutex,第二次调用的时候确实没有启动,但是,如果第一次调用的已经关闭了,再次调用的时候就没有反应了,等于CreateMutex还在起作用呀!不知道有没有其它的方法.

    C/C++ code
    //试试这个,你那个看着有点乱,改了改,看是否合适 HANDLE mutex ; const char mutexname [] = "EEGSysSet" ; mutex = CreateMutex(0,1,mutexname); if(!ERROR_ALREADY_EXISTS == ::GetLastError()|| mutex == NULL) { MessageBox(0,"您已经起动了本程序!","提醒:禁止多次运行。",MB_OK); return ; } ShellExecute(NULL, "", ans.c_str(), "EEGSys", CDBIN, SW_MAXIMIZE);

    HANDLE mutex ;
    是个全局的,你有没有注销这个 HANDLE 。

    你程序只能对自己本事多次调用起到作用,但是对于外界关闭程序,并没有促使你释放信号量,所以不可以!

    up

    该回复于2008-07-10 02:38:26被版主删除

    该回复于2008-07-10 02:47:04被版主删除

  • Filed under: C++ Builder
  • 如题,,,急急急呀!!!

    这个问题我也遇到过,我现在加了一个群,这个群人气较好,也的确有高手,不但可以交流问题,而且还可以接项目赚钱,QQ群号是:陆$肆$柒$玖$捌&柒&伍&伍,不要说我做广告,看看便知,如需要的话加入试试,如果你发现好的交流群也别忘了告诉我啊!呵呵!

    http://topic.csdn.net/t/20021219/19/1278188.html

    保护方式下,好象不能让你这样调用的。

    在xp、2000、2003下还是用CreateFile吧。绝对可以的。

  • Filed under: C++ Builder
  • 我有一个远程文件,在web服务器上。
    现在想调用本地的暴风影音播放器播放。
    要怎么做才行?

    ShellExecute(NULL,"open","mplayerrc.exe",文件路径,NULL,SW_SHOWNORMAL);

    这个不行。

    有没有调用的时候能带参数的?

    我自己测试是可以的,你路径弄对没有?

    路径对了啊。
    你那个能播放例如:http://192.168.1.10/A/aaa.mp4
    这样的文件吗?

    播放本地的文件没有问题了。
    远程的还是放不了

    我用MP3测试的 能放。我用的是暴风影音6.4.9.
    你在开始->运行里面输入"mplayerrc.exe http://192.168.1.10/A/aaa.mp4"试试

    也可能和WEB服务器的设置有关

    你那边用web服务器可以打开吗?
    换个文件格式试试一下

    我用WEB服务器可以打开,但是我的WEB服务器权限是可以浏览目录的,不知道和这个有关系没有

    那我修改一下,再试试

    我的web服务器也是可以目录浏览的,但是还不行

    你那边有防火墙吗?

    没有

    还有人能帮忙回答吗?

  • Filed under: C++ Builder
  • 在Form1里面有一个这样的结构体
    在头文件里有这样的定义
    struct Filedata

    string aa;
    string bb;
    };
    然后在Form1里对其赋值
    我想从Form2里调用bb该怎么办啊?
    请各位高手来帮帮忙……无尽感激……

    记得先#include哦

    回答完了才发现没分 - -

    加了,也不行啊……

    按照我的理解,你的form1.h里有这样的定义
    struct Filedata

    string aa;
    string bb;
    };
    然后在form1.cpp里以全局变量的方式实例化
    Filedata fd;

    是这样的吧?

    那好,在你的form2.cpp中

    #include "form2.cpp"
    ……

    extern Filedata fd;

    这样应该就可以了

    sorry,刚才写错了一个字符,应该是:

    按照我的理解,你的form1.h里有这样的定义
    struct Filedata

    string aa;
    string bb;
    };
    然后在form1.cpp里以全局变量的方式实例化
    Filedata fd;

    是这样的吧?

    那好,在你的form2.cpp中

    #include "form1.cpp"
    ……

    extern Filedata fd;

    这样应该就可以了

    哥们,可以#include "form1.cpp" 这样的吗?我的编译通不过哎……

    把你的struct定义放到Form1.h里,然后在From2.h里include Form1.h
    …..

    0分

    出差在外,网吧上网,手头上没有以前写的程序,忘了到底是不是包含.cpp了,你自己试一下嘛:(

    引用 7 楼 liuyunroger 的回复:
    哥们,可以#include "form1.cpp" 这样的吗?我的编译通不过哎……

    谢了,我已经可以调用那些数据了

  • Filed under: C++ Builder
  • 我想同过URLDownloadToFile来下载一个东西,但是不知道怎么调用Urlmon.dll。

    文档标题:BCB 编写 DLL 终极手册
     原作者:Behard
    更新日期:2003-06-05
    浏览次数:11652
     关键字:DLL,DLL作为MDIChild,BCB调用VC编译的DLL
      由于现在比较多的网友老是在 CSDN 上询问关于 BCB 编写 DLL 的问题,我编写了这篇文章抛砖引玉

    一. 编写 DLL
      File/New/Dll 生成 Dll 的向导,然后可以添加导出函数和导出类
      导出函数:extern "C" __declspec(dllexport) ExportType FunctionName(Parameter)
      导出类:class __declspec(dllexport) ExportType ClassName{…}
      例子:(说明:只是生成了一个 DLL.dll )

    #include "DllForm.h"  // TDllFrm 定义

    USERES("Dll.res");
    USEFORM("DllForm.cpp", DllFrm);

    class __declspec(dllexport) __stdcall MyDllClass { //导出类
        public:
          MyDllClass();
          void CreateAForm();
          TDllFrm* DllMyForm;
    };

    TDllFrm* DllMyForm2;
    extern "C" __declspec(dllexport) __stdcall void CreateFromFunct();//导出函数

    //—————————————————————————
    int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
    {
        return 1;
    }
    //—————————————————————————

    MyDllClass::MyDllClass()
    {
    }

    void MyDllClass::CreateAForm()
    {
        DllMyForm = new TDllFrm(Application);
        DllMyForm->Show();
    }
    //—————————————————————————
    void __stdcall CreateFromFunct()
    {
        DllMyForm2 = new TDllFrm(Application);
        DllMyForm2->Show();
    }

    二. 静态调用 DLL
    使用 $BCB path\Bin\implib.exe 生成 Lib 文件,加入到工程文件中
    将该文件拷贝到当前目录,使用 implib MyDll.lib MyDll.dll 生成
    // Unit1.h // TForm1 定义
    #include "DllForm.h" // TDllFrm 定义
    //—————————————————————————

    __declspec(dllimport) class __stdcall MyDllClass {
        public:
            MyDllClass();
            void CreateAForm();
            TDllFrm* DllMyForm;
    };
    extern "C" __declspec(dllimport) __stdcall void CreateFromFunct();

    class TForm1 : public TForm{…}

    // Unit1.cpp // TForm1 实现
    void __fastcall TForm1::Button1Click(TObject *Sender)
    { // 导出类实现,导出类只能使用静态方式调用
        DllClass = new MyDllClass();
        DllClass->CreateAForm();   
    }
    //—————————————————————————
    void __fastcall TForm1::Button2Click(TObject *Sender)
    { // 导出函数实现
        CreateFromFunct();
    }
    //—————————————————————————

    void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
    {
        delete DllClass;
    }

    三. 动态调用 DLL
    // Unit1.h
    class TForm1 : public TForm
    {

    private: // User declarations
    void (__stdcall *CreateFromFunct)();

    }

    // Unit1.cpp // TForm1
    HINSTANCE DLLInst = NULL;
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
        if( NULL == DLLInst ) DLLInst = LoadLibrary("DLL.dll"); //上面的 Dll
        if (DLLInst) {
            CreateFromFunct = (void (__stdcall*)()) GetProcAddress(DLLInst,
                                                        "CreateFromFunct");
            if (CreateFromFunct) CreateFromFunct();
            else ShowMessage("Could not obtain function pointer");
        }
        else ShowMessage("Could not load DLL.dll");
    }

    void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
    {
        if ( DLLInst ) FreeLibrary (DLLInst);
    }
     
    四. DLL 作为 MDIChild (子窗体) 【只编写动态调用的例子】
        实际上,调用子窗体的 DLL 时,系统只是检查应用程序的 MainForm 是否为 fsMDIForm 的窗体,这样只

    要把调用程序的 Application 的 Handle 传递给 DLL 的 Application 即可;同时退出 DLL 时也要恢复

    Application

    // MDIChildPro.cpp // Dll 实现 CPP
    #include "unit1.h" // TForm1 定义
    TApplication *SaveApp = NULL;
    int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
    {
        if ( (reason==DLL_PROCESS_DETACH) && SaveApp )
    // 本文转自 C++Builder 研究 - http://www.ccrun.com/article.asp?i=498&d=f36445
            Application = SaveApp ; // 恢复 Application
        return 1;
    }

    extern "C" __declspec(dllexport) __stdcall void TestMDIChild(    //1024X768
        TApplication* mainApp,
        LPSTR lpCaption)
    {
        if ( NULL == SaveApp ) // 保存 Application,传递 Application
        {
            SaveApp = Application;
            Application = mainApp;
        }
        // lpCaption 为子窗体的 Caption
        TForm1 *Form1 = new TForm1 ( Application, lpCaption );
        Form1->Show();
    }
    注:上面的程序使用 BCB 3.0 编译成功

    五. BCB 调用 VC 编写的 DLL
      1. 名字分解:
        没有名字分解的函数
            TestFunction1 // __cdecl calling convention
            @TestFunction2 // __fastcall calling convention
            TESTFUNCTION3 // __pascal calling convention
            TestFunction4 // __stdcall calling convention
        有名字分解的函数
            @TestFunction1$QV // __cdecl calling convention
            @TestFunction2$qv // __fastcall calling convention
            TESTFUNCTION3$qqrv // __apscal calling convention
            @TestFunction4$qqrv // __stdcall calling convention
        使用 extern "C" 不会分解函数名

        使用 Impdef MyLib.def MyLib.DLL 生成 def 文件查看是否使用了名字分解

      2. 调用约定:
        __cdecl 缺省
          是 Borland C++ 的缺省的 C 格式命名约定,它在标识符前加一下划线,以保留
        它原来所有的全程标识符。参数按最右边参数优先的原则传递给栈,然后清栈。
            extaern "C" bool __cdecl TestFunction();
          在 def 文件中显示为
            TestFunction @1
          注释: @1 表示函数的顺序数,将在“使用别名”时使用。

        __pascal Pascal格式
          这时函数名全部变成大写,第一个参数先压栈,然后清栈。
            TESTFUNCTION @1 //def file

        __stdcall 标准调用
          最后一个参数先压栈,然后清栈。
            TestFunction @1 //def file

        __fastcall 把参数传递给寄存器
          第一个参数先压栈,然后清栈。
            @TestFunction @1 //def file

      3. 解决调用约定:
          Microsoft 与 Borland 的 __stdcall 之间的区别是命名方式。 Borland 采用
        __stdcall 的方式去掉了名字起前的下划线。 Microsoft 则是在前加上下划线,在
        后加上 @ ,再后跟为栈保留的字节数。字节数取决于参数在栈所占的空间。每一个
        参数都舍入为 4 的倍数加起来。这种 Miocrosoft 的 DLL 与系统的 DLL 不一样。

      4. 使用别名:
          使用别名的目的是使调用文件 .OBJ 与 DLL 的 .DEF 文件相匹配。如果还没有
        .DEF 文件,就应该先建一个。然后把 DEF 文件加入 Project。使用别名应不断
        修改外部错误,如果没有,还需要将 IMPORTS 部分加入 DEF 文件。
            IMPORTS
            TESTFUNCTIOM4 = DLLprj.TestFunction4
            TESTFUNCTIOM5 = DLLprj.WEP @500
            TESTFUNCTIOM6 = DLLprj.GETHOSTBYADDR @51
          这里需要说明的是,调用应用程序的 .OBJ 名与 DLL 的 .DEF 文件名是等价的,
        而且总是这样。甚至不用考虑调用约定,它会自动匹配。在前面的例子中,函数被
        说明为 __pascal,因此产生了大写函数名。这样链接程序不会出错。

      5. 动态调用例子
    VC DLL 的代码如下:
    extern "C" __declspec(dllexport) LPSTR __stdcall BCBLoadVCWin32Stdcall()
    {
    static char strRetStdcall[256] = "BCB Load VC_Win32 Dll by __stdcall mode is OK!";

    return strRetStdcall;
    }

    extern "C" __declspec(dllexport) LPSTR __cdecl BCBLoadVCWin32Cdecl()
    {
    static char strRetCdecl[256] = "BCB Load VC_Win32 Dll by __cdecl mode is OK!";

    return strRetCdecl;
    }

    extern "C" __declspec(dllexport) LPSTR __fastcall BCBLoadVCWin32Fastcall()
    {
    static char strRetFastcall[256] = "BCB Load VC_Win32 Dll by __fastcall mode is OK!";

    return strRetFastcall;
    }

        其实动态调用与调用 BCB 编写的 DLL 没有区别,关键是查看 DLL 的导出函数名字
        可以使用 tdump.exe(BCB工具) 或者 dumpbin.exe(VC工具) 查看
        tdump -ee MyDll.dll >1.txt (查看 1.txt 文件即可)
        由于 VC6 不支持 __pascall 方式,下面给出一个三种方式的例子
    void __fastcall TForm1::btnBLVCWin32DynClick(TObject *Sender)
    {
        /*cmd: tdbump VCWin32.dll >1.txt
    Turbo Dump  Version 5.0.16.4 Copyright (c) 1988, 1998 Borland International
                        Display of File VCWIN32.DLL

    EXPORT ord:0000='BCBLoadVCWin32Fastcall::'
    EXPORT ord:0001='BCBLoadVCWin32Cdecl'
    EXPORT ord:0002='_BCBLoadVCWin32Stdcall@0'
        */
        if ( !DllInst )
            DllInst = LoadLibrary ( "VCWin32.dll" );
        if ( DllInst )
        {
            BCBLoadVCWin32Stdcall = (LPSTR (__stdcall *) () )
                GetProcAddress ( DllInst, "_BCBLoadVCWin32Stdcall@0" ); //VC Dll
                // GetProcAddress ( DllInst, "BCBLoadVCWin32Stdcall" ); //BCB Dll
            if ( BCBLoadVCWin32Stdcall )
            {
                ShowMessage( BCBLoadVCWin32Stdcall() );
            }
            else ShowMessage ( "Can't find the __stdcall Function!" );

            BCBLoadVCWin32Cdecl = (LPSTR (__cdecl *) () )
                GetProcAddress ( DllInst, "BCBLoadVCWin32Cdecl" );
            if ( BCBLoadVCWin32Cdecl )
            {
                ShowMessage( BCBLoadVCWin32Cdecl() );
            }
            else ShowMessage ( "Can't find the __cdecl Function!" );

            //Why?不是 'BCBLoadVCWin32Fastcall::',而是 '@BCBLoadVCWin32Fastcall@0'?
            BCBLoadVCWin32Fastcall = (LPSTR (__fastcall *) () )
                //GetProcAddress ( DllInst, "BCBLoadVCWin32Fastcall::" );
                GetProcAddress ( DllInst, "@BCBLoadVCWin32Fastcall@0" );
            if ( BCBLoadVCWin32Fastcall )
            {
                ShowMessage( BCBLoadVCWin32Fastcall() );
            }
            else ShowMessage ( "Can't find the __fastcall Function!" );
        }
        else ShowMessage ( "Can't find the Dll!" );
    }

      6. 静态调用例子
        静态调用有点麻烦,从动态调用中可以知道导出函数的名字,但是直接时(加入 lib 文件到工程文件)

    Linker 提示不能找到函数的实现
        从 4 看出,可以加入 def 文件连接
        (可以通过 impdef MyDll.def MyDll.dll 获得导出表)
        建立与 DLL 文件名一样的 def 文件与 lib 文件一起加入到工程文件
        上面的 DLL(VCWIN32.dll) 的 def 文件为(VCWIN32.def):
    LIBRARY    VCWIN32.DLL

    IMPORTS
        @BCBLoadVCWin32Fastcall    = VCWIN32.@BCBLoadVCWin32Fastcall@0
        _BCBLoadVCWin32Cdecl        = VCWIN32.BCBLoadVCWin32Cdecl
        BCBLoadVCWin32Stdcall      = VCWIN32._BCBLoadVCWin32Stdcall@0

    对应的函数声明和实现如下:
    extern "C" __declspec(dllimport) LPSTR __fastcall BCBLoadVCWin32Fastcall();
    extern "C" __declspec(dllimport) LPSTR __cdecl BCBLoadVCWin32Cdecl();
    extern "C" __declspec(dllimport) LPSTR __stdcall BCBLoadVCWin32Stdcall();

    void __fastcall TfrmStatic::btnLoadDllClick(TObject *Sender)
    {
        ShowMessage ( BCBLoadVCWin32Fastcall() );
        ShowMessage ( BCBLoadVCWin32Cdecl() );
        ShowMessage ( BCBLoadVCWin32Stdcall() );
    }
    注意:在 BCB 5.0 中,可能直接按下 F9 是不能通过 Linker 的,请先 Build 一次
    注:上面的程序使用 BCB 5.0 与 VC6.0 编译成功

    up

    一段能够下载文件的源代码
    http://www.ccrun.com/article.asp?i=145&d=50gcoa

    C/C++ code
    /* 文档标题:一段能够下载文件的源代码 原作者:佚名 更新日期:2002-11-01 浏览次数:4074 关键字:下载文件,URLDownloadToFile */ // 在工程中加入 Urlmon.lib //————————————————————————— #include <vcl.h> #include <windows.h> #include <Urlmon.h> #pragma hdrstop #include "Unit1.h" //————————————————————————— cImpMonikerCallback objImpCallback; //————————————————————————— #pragma argsused WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { LPUNKNOWN pCaller; pCaller = NULL; DWORD dwResv = 0; objImpCallback.lpfnCB = (IBindStatusCallback *)&objImpCallback; HRESULT hRet=URLDownloadToFile(pCaller,"http://127.0.0.1:30000/download/icon.zip","d:\\temp\\icon.zip",dwResv,objImpCallback.lpfnCB); if(hRet==S_OK) MessageBox(NULL,"成功下载文件","",MB_OK); return 0; } //————————————————————————— cImpMonikerCallback::cImpMonikerCallback() { m_cRef = 1; m_pbinding = NULL; }; //————————————————————————— cImpMonikerCallback::~cImpMonikerCallback() { if(m_pbinding) m_pbinding->Release(); }; //————————————————————————— STDMETHODIMP cImpMonikerCallback::QueryInterface(REFIID riid,void ** ppv) { *ppv = NULL; if (riid==IID_IUnknown &brvbar;&brvbar; riid==IID_IBindStatusCallback) { *ppv = this; AddRef(); return S_OK; } return E_NOINTERFACE; // 本文转自 C++Builder 研究 - http://www.ccrun.com/article.asp?i=145&d=50gcoa }; //————————————————————————— STDMETHODIMP_(ULONG) cImpMonikerCallback::AddRef() { return m_cRef++; } //————————————————————————— STDMETHODIMP_(ULONG) cImpMonikerCallback::Release() { if(m_cRef==0) { delete this; return 0; } return m_cRef; } //————————————————————————— STDMETHODIMP cImpMonikerCallback::GetBindInfo(DWORD* pgrfBINDF, BINDINFO* pbindinfo) { return(NOERROR); } //————————————————————————— STDMETHODIMP cImpMonikerCallback::OnStartBinding(DWORD grfBSCOption, IBinding* pbinding) { return(NOERROR); } //————————————————————————— STDMETHODIMP cImpMonikerCallback::GetPriority(LONG* pnPriority) { return(NOERROR); } //————————————————————————— STDMETHODIMP cImpMonikerCallback::OnProgress(ULONG ulProgress, ULONG ulProgressMax,ULONG ulStatusCode, LPCWSTR szStatusText) { return(NOERROR); }; //————————————————————————— STDMETHODIMP cImpMonikerCallback::OnDataAvailable(DWORD grfBSCF, DWORD dwSize, FORMATETC *pfmtetc,STGMEDIUM* pstgmed) { return(NOERROR); } //————————————————————————— STDMETHODIMP cImpMonikerCallback::OnObjectAvailable(REFIID riid, IUnknown* punk) { return(NOERROR); } //————————————————————————— STDMETHODIMP cImpMonikerCallback::OnLowResource(DWORD dwReserved) { return(NOERROR); } //————————————————————————— STDMETHODIMP cImpMonikerCallback::OnStopBinding(HRESULT hrStatus, LPCWSTR szText) { return(NOERROR); } //————————————————————————— /////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// class cImpMonikerCallback:public IBindStatusCallback { DWORD m_cRef; IBinding* m_pbinding; public: cImpMonikerCallback(); ~cImpMonikerCallback(); STDMETHODIMP QueryInterface(REFIID riid,void ** ppv); STDMETHODIMP_(ULONG) AddRef();// { return m_cRef++; } STDMETHODIMP_(ULONG) Release(); STDMETHODIMP GetBindInfo(DWORD* pgrfBINDF, BINDINFO* pbindinfo); STDMETHODIMP OnStartBinding(DWORD grfBSCOption, IBinding* pbinding); STDMETHODIMP GetPriority(LONG* pnPriority); STDMETHODIMP OnProgress(ULONG ulProgress, ULONG ulProgressMax,ULONG ulStatusCode, LPCWSTR szStatusText); STDMETHODIMP OnDataAvailable(DWORD grfBSCF, DWORD dwSize, FORMATETC *pfmtetc,STGMEDIUM* pstgmed); STDMETHODIMP OnObjectAvailable(REFIID riid, IUnknown* punk); STDMETHODIMP OnLowResource(DWORD dwReserved); STDMETHODIMP OnStopBinding(HRESULT hrStatus, LPCWSTR szText); LPBINDSTATUSCALLBACK lpfnCB; PSTR sURL; PSTR sFile; char cSysDir[MAX_PATH]; DWORD dwPlatform; };

    你想要调用Urlmon.dll,你必须知道它的导出函数名称和它的参数。然后用静态或动态来调用。不是说你见到dll文件就可以使用它。

    关注学习中.

    收藏

    顶!!!
    厉害,学习中…

    该回复于2008-07-10 02:51:06被版主删除

  • Filed under: C++ Builder
  • [调用]BCB调用问题

    我一个初学菜鸟。看了一段代码,很不明白。在程序中调用了一个叫check_status()的函数。找到头部文件的public里面由一个
    void check_status();
    我就纳闷了,这个函数的代码上哪去了?
    是不是被封装了还是怎么的?

    谢啦,终于找到。学习了

  • Filed under: C++ Builder
  • 这个函数该如何调用?(不会传入参数)

    __int16 rf_load_key(HANDLE icdev,unsigned char _Mode,unsigned char SecNr, unsigned char * _Nkey);

    功能:向读写器的RAM 装入密码

    参数:HANDLE icdev:rf_init() 返回的设备描述符
    unsigned char _Mode :同 rf_authentication()  加密模式,1
    unsigned char _SecNr :同 rf_authentication() 端口,1
    unsigned char *_Nkey :包含了要写入硬件系统RAM 中的卡密码  密码:6个F
    返回:成功则返回 0

    C/C++ code
    typedef BYTE (__stdcall *FUNCPTR)(HANDLE ,unsigned char ,unsigned char , unsigned char * ); HINSTANCE hinst=LoadLibrary("XXX.dll"); FUNCPTR p=(FUNCPTR)GetProcAddress(hinst,"rf_load_key"); //下面是假设得调用,你需要干什么,然后自己调用 p(0,1,1, "FFFFFF");

    akirya ,照你的写法写了,提示 cannot convert AnsiString to void *

    顶,在线等指点……

    …..

  • Filed under: C++ Builder
  • 设想的过程:
    1.在VC界面上点击Test,出现如下的界面(进入BCB的程序)

    2.点击“工艺设计环境”,出现“打开”的界面(BCB的程序)

    实际的程序异常
    1.VC主程序调用BCB的第一个界面,比较正常

    2.BCB中的程序点击“工艺设计环境”出现错误

    部分程序:

    VC中调用BCB的CreatForm();
    void CMainFrame::OnTest()
    {
    // TODO: Add your command handler code here
        CreatForm();
    }

    BCB的DLL中CreatForm();
    void __cdecl  CreatForm  (void)
    {
      InterFace = new TInterFace(NULL);
      InterFace->Show();
    }

    设计思想:
        主要是两段程序,主程序是VC开发的,主要完成Proe三维参数的提取,DLL是BCB的程序,与数据库相关联,处理数据业务(包括数据合并、排序等)。通过VC中的某个函数(Button)实现调用BCB程序。

    PS:图片不知道怎样传来,麻烦到http://blog.csdn.net/gougouzhang/archive/2008/03/03/2142446.aspx
    谢谢各位

    该回复于2008-07-10 02:48:50被版主删除

    该回复于2008-07-10 02:42:31被版主删除

  • Filed under: C++ Builder
  • 对于DLL的生成与调用,看过一些文章,但是仍不明白怎么运用。希望哪位热心人能比较详细的说一下,或介绍有详细解说的文章,只要能生成并调用一个简单的DLL,两百分重谢!!

    建议你还是去找本bcb的书吧

    书上讲dll的很多的,你可以参考,

    论坛上不怎么好说明!

    http://topic.csdn.net/t/20031022/14/2382990.html

    http://www.ccrun.com/article.asp?i=106&d=r3n13t

    一、创建:
      使用BCB File &brvbarNEW建立一个新的DLL工程,并保存好文件BCB,生成一个DLL的程序框架。
      1.DllEntryPoint函数为一个入口方法,如果使用者在DLL被系统初始化或者注销时被调用,用来写入对DLL的初始化程序和卸载程序;参数:hinst用来指示DLL的基地址;reason用来指示DLL的调用方式,用于区别多线程单线程对DLL的调用、创建、卸载DLL;
      2.在程序中加入自己所要创建的DLL过程、函数;
      3.用dllimport描述出口;
      例程序如下:
       #include
       #pragma hdrstop

      extern "C" __declspec(dllexport) int test();

      int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason,void *)
      {
       return 1;
      }

      int test()
      {
        return 3;
      }

      注意:动态链接库中调用过程、函数时有不同的CALL方式 __cdecl、__pascal, __fastcall、__stdcall,BCB中默认的方式为__cdecl(可不写),如果考虑兼容性可用时__stdcall声明方法为:
      extern "C" __declspec(dllexport) int __stdcall test();
      对于其中过程、函数也改为:
      int __stdcall test()

      二、使用DLL
      在BCB中使用DLL有两种方法:

      1.用静态调用法
      首先需要在BCB的项目中加入输入接口库(import library),打开工程项目,使用BCB View &brvbarProject Manager打开项目列表,向项目中加入接口库(*.lib)。
      其次在头文件中加入接口声明。
      例程序如下:
       //define in include file
       extern "C" __declspec(dllimport) int __cdecl test();
      //use function in main program
      int I;
      I=test();
      注意:
      (1)动态链接库调用过程、函数时CALL方式 与创建时方式一样不写为__cdecl,其它需要声明。
      (2)BCB创建的DLL有对应的输入接口库(import library),如只有DLL而无库时,可用BCB的implib工具产生:implib xxx.lib xxx.dll;另外可用:tlibxxx.lib,xxx.lst 产生DLL的内部函数列表,许多Windows的未公开技术就是用这种方法发现的。

      2.动态调用法
      动态调用法要用Windows API 中的LoadLibrary()和GetProcAddress()来调入DLL库,指出库中函数位置,这种方法较常见。
      例程序如下:

       HINSTANCE dd;
       int _stdcall (*ddd)(void);
       dd=LoadLibrary("xxx.dll");
       ddd=GetProcAddress(dd,"test");
       Caption=IntToStr(ddd());
      FreeLibrary(dd);

      三、注意:
      创建DLL时编译链接时注意设置Project Options。
      Packages标签:去除Builder with runtime packages检查框。
      Linker标签:去除Use dynamic RTL检查框。
      否则创建的DLL需要Runtime packages or Runtime library。

    论坛搜索“dll”

    这方面的资料很多。需要的话,可以MAIL我,给你些。

    建议你研究一下kernel32.dll
    都在这里呢

    引用 7 楼 li_fw 的回复:
    这方面的资料很多。需要的话,可以MAIL我,给你些。

    可以发些资料给我就谢谢了,邮箱:honyin@21cn.com

    同时也谢谢楼上的其它几位热心人!!

    http://blog.csdn.net/52vc/archive/2008/03/05/2148368.aspx

    支持2楼
    挺好的

  • Filed under: C++ Builder
  • 类别

    最新

    标签

    链接


    存档