积极答复者
VC++ 2010调用 C\C++ lib库

问题
-
一、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控制台应用程序中运行成功。
五、谢谢,此问题研究了好几天了也没解决。