none
VC++ 2010调用 C\C++ lib库 RRS feed

  • 问题

  • 一、windows窗体应用程序代码

    #pragma once

    #include "pcap.h"

    //int _declspec(dllimport) __stdcall pcap_findalldevs(pcap_if_t **, char *);

    namespace NetworkPacketsManager {

     using namespace System;
     using namespace System::ComponentModel;
     using namespace System::Collections;
     using namespace System::Windows::Forms;
     using namespace System::Data;
     using namespace System::Drawing;

     /// <summary>
     /// formMain 摘要
     /// </summary>
     public ref class formMain : public System::Windows::Forms::Form
     {
     public:
      formMain(void)
      {
       InitializeComponent();
       //
       //TODO: 在此处添加构造函数代码
       //
      }

     protected:
      /// <summary>
      /// 清理所有正在使用的资源。
      /// </summary>
      ~formMain()
      {
       if (components)
       {
        delete components;
       }
      }
     private: System::Windows::Forms::Label^  label1;
     private: System::Windows::Forms::ComboBox^  comboBoxNetworkDevices;


     protected:


     private:
      /// <summary>
      /// 必需的设计器变量。
      /// </summary>
      System::ComponentModel::Container ^components;

    #pragma region Windows Form Designer generated code
      /// <summary>
      /// 设计器支持所需的方法 - 不要
      /// 使用代码编辑器修改此方法的内容。
      /// </summary>
      void InitializeComponent(void)
      {
       this->label1 = (gcnew System::Windows::Forms::Label());
       this->comboBoxNetworkDevices = (gcnew System::Windows::Forms::ComboBox());
       this->SuspendLayout();
       //
       // label1
       //
       this->label1->AutoSize = true;
       this->label1->Location = System::Drawing::Point(26, 22);
       this->label1->Name = L"label1";
       this->label1->Size = System::Drawing::Size(83, 12);
       this->label1->TabIndex = 0;
       this->label1->Text = L"选择网络接口:";
       //
       // comboBoxNetworkDevices
       //
       this->comboBoxNetworkDevices->FormattingEnabled = true;
       this->comboBoxNetworkDevices->Location = System::Drawing::Point(129, 19);
       this->comboBoxNetworkDevices->Name = L"comboBoxNetworkDevices";
       this->comboBoxNetworkDevices->Size = System::Drawing::Size(167, 20);
       this->comboBoxNetworkDevices->TabIndex = 1;
       //
       // formMain
       //
       this->AutoScaleDimensions = System::Drawing::SizeF(6, 12);
       this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
       this->ClientSize = System::Drawing::Size(797, 262);
       this->Controls->Add(this->comboBoxNetworkDevices);
       this->Controls->Add(this->label1);
       this->Name = L"formMain";
       this->Text = L"网络数据包管理";
       this->Load += gcnew System::EventHandler(this, &formMain::formMain_Load);
       this->ResumeLayout(false);
       this->PerformLayout();

      }
    #pragma endregion
     private: System::Void formMain_Load(System::Object^  sender, System::EventArgs^  e) {

         pcap_if_t *alldevs;

         char errbuf[PCAP_ERRBUF_SIZE];  /* 出错信息 */

     
        if(pcap_findalldevs(&alldevs, errbuf) == -1)
        {
         //fprintf(stderr,"检索错误信息: %s\n", errbuf);
         exit(1);
        }
     
         ////加入组合框供选
         //for(int i=0;i<4;i++)
         //{
         //comboBoxNetworkDevices->Items->Add(i);
         //}
        }
     };
    }

    二、pcap.h文件中代码包含了声明语句如下 C\C++代码


    int pcap_findalldevs(pcap_if_t **, char *);

     

    三、编译结果:

    1>------ 已启动生成: 项目: NetworkPacketsManager, 配置: Debug Win32 ------
    1>生成启动时间为 2012/12/2 12:48:34。
    1>InitializeBuildStatus:
    1>  正在对“Debug\NetworkPacketsManager.unsuccessfulbuild”执行 Touch 任务。
    1>GenerateTargetFrameworkMonikerAttribute:
    1>正在跳过目标“GenerateTargetFrameworkMonikerAttribute”,因为所有输出文件相对于输入文件而言都是最新的。
    1>ClCompile:
    1>  所有输出均为最新。
    1>  NetworkPacketsManager.cpp
    1>  所有输出均为最新。
    1>CoreResGen:
    1>  所有输出均为最新。
    1>ResourceCompile:
    1>  所有输出均为最新。
    1>NetworkPacketsManager.obj : error LNK2031: 无法为 "extern "C" int __clrcall pcap_findalldevs(struct pcap_if * *,char *)" (?pcap_findalldevs@@$$J0YMHPAPAUpcap_if@@PAD@Z) 生成 p/invoke;元数据中缺少调用约定
    1>NetworkPacketsManager.obj : error LNK2028: 无法解析的标记(0A000012) "extern "C" int __clrcall pcap_findalldevs(struct pcap_if * *,char *)" (?pcap_findalldevs@@$$J0YMHPAPAUpcap_if@@PAD@Z),该标记在函数 "private: void __clrcall NetworkPacketsManager::formMain::formMain_Load(class System::Object ^,class System::EventArgs ^)" (?formMain_Load@formMain@NetworkPacketsManager@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z) 中被引用
    1>NetworkPacketsManager.obj : error LNK2019: 无法解析的外部符号 "extern "C" int __clrcall pcap_findalldevs(struct pcap_if * *,char *)" (?pcap_findalldevs@@$$J0YMHPAPAUpcap_if@@PAD@Z),该符号在函数 "private: void __clrcall NetworkPacketsManager::formMain::formMain_Load(class System::Object ^,class System::EventArgs ^)" (?formMain_Load@formMain@NetworkPacketsManager@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)中被引用
    1>C:\Users\yax\Documents\Visual Studio 2010\Projects\NetworkPacketsManager\Debug\NetworkPacketsManager.exe : fatal error LNK1120: 2 个无法解析的外部命令
    1>
    1>生成失败。
    1>
    1>已用时间 00:00:02.08
    ========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

    四、主要代码放在win32控制台应用程序中运行成功。

    五、谢谢,此问题研究了好几天了也没解决。

    2012年12月2日 4:57

答案