BCB6工程如何加载lib和dll文件

lianrouwupan 2014-11-26 10:17:16
有一个工程需要用到PowerDuplicateScheme函数
看了MSDN,该函数调用需要以下支持:
Header PowrProf.h

Library PowrProf.lib

DLL PowrProf.dll

想问下PowrProf.lib和PowrProf.dll 如何加载到工程里?
...全文
272 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lianrouwupan 2014-11-27
  • 打赏
  • 举报
回复
难道是BCB6不支持这个函数?
ccrun.com 2014-11-26
  • 打赏
  • 举报
回复
你已经包含了头文件 <powrprof.h> 就不要在代码中再添加 PowerDuplicateScheme 的声明了。 并且,你一直不肯说自己用的是C++Builder哪个版本,那么这个机密我也就不再问你了。除了上面说的,还有个问题是你的 GUID_BALANCED 没有定义,需要自己定义一下。
lianrouwupan 2014-11-26
  • 打赏
  • 举报
回复
引用 4 楼 ccrun 的回复:
看了你上面的代码,我不想说什么了。 严重建议你用动态调用的方法,也就是我在1楼提供的代码。

#include <vcl.h>
#include <powrprof.h>
#pragma link "C:\\Program Files\\Borland\\CBuilder6\\Lib\\powrprof.lib"
#pragma hdrstop


#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
DWORD WINAPI PowerDuplicateScheme( __in_opt HKEY RootPowerKey, __in const GUID *SourceSchemeGuid, __in GUID **DestinationSchemeGuid );
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   WCHAR displayBuffer[_MAX_PATH] = L"超级节能";
   DWORD displayBufferSize = _MAX_PATH;
   GUID *GUID_HIGH_POWERSAVE = NULL;
   if(ERROR_SUCCESS == PowerDuplicateScheme(NULL,&GUID_BALANCED,&GUID_HIGH_POWERSAVE))
   {
       ShowMessage("DuplicateScheme ok");
   }
}
//---------------------------------------------------------------------------
麻烦再看一下。想先研究好静态调用。我已经通过implib生成lib 现在还是报一堆错: [C++ Error] Unit1.cpp(20): E2451 Undefined symbol '__in_opt' [C++ Error] Unit1.cpp(20): E2293 ) expected [C++ Error] Unit1.cpp(26): E2451 Undefined symbol 'GUID_BALANCED' [C++ Error] Unit1.cpp(26): E2314 Call of nonfunction [C++ Warning] Unit1.cpp(30): W8004 'GUID_HIGH_POWERSAVE' is assigned a value that is never used [C++ Warning] Unit1.cpp(30): W8004 'displayBufferSize' is assigned a value that is never used [C++ Warning] Unit1.cpp(30): W8004 'displayBuffer' is assigned a value that is never used
ccrun.com 2014-11-26
  • 打赏
  • 举报
回复
看了你上面的代码,我不想说什么了。 严重建议你用动态调用的方法,也就是我在1楼提供的代码。
lianrouwupan 2014-11-26
  • 打赏
  • 举报
回复
引用 2 楼 ccrun 的回复:
补充一下,如果在C6中想静态调用这个函数,就自己用implib从PowrProf.dll中生成CB能用的.lib文件,然后加入到工程中,再自己声明一下TPowerDuplicateScheme函数的原型就可以使用了。

#include <powrprof.h>
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
DWORD WINAPI PowerDuplicateScheme( __in_opt HKEY RootPowerKey, __in const GUID *SourceSchemeGuid, __in GUID **DestinationSchemeGuid );
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   WCHAR displayBuffer[_MAX_PATH] = L"超级节能";
   DWORD displayBufferSize = _MAX_PATH;
   GUID *GUID_HIGH_POWERSAVE = NULL;
   if(ERROR_SUCCESS == PowerDuplicateScheme(NULL,&GUID_BALANCED,&GUID_HIGH_POWERSAVE))
   {
       MessageBox("DuplicateScheme ok");
   }
}
然后报了一堆错误: [C++ Error] powrprof.h(37): E2303 Type name expected [C++ Error] powrprof.h(37): E2139 Declaration missing ; [C++ Error] powrprof.h(38): E2303 Type name expected [C++ Error] powrprof.h(38): E2139 Declaration missing ; [C++ Error] powrprof.h(39): E2303 Type name expected [C++ Error] powrprof.h(39): E2238 Multiple declaration for '_GLOBAL_MACHINE_POWER_POLICY::SYSTEM_POWER_STATE' [C++ Error] powrprof.h(38): E2344 Earlier declaration of '_GLOBAL_MACHINE_POWER_POLICY::SYSTEM_POWER_STATE' [C++ Error] powrprof.h(39): E2139 Declaration missing ; [C++ Error] powrprof.h(40): E2303 Type name expected [C++ Error] powrprof.h(40): E2238 Multiple declaration for '_GLOBAL_MACHINE_POWER_POLICY::ULONG' [C++ Error] powrprof.h(37): E2344 Earlier declaration of '_GLOBAL_MACHINE_POWER_POLICY::ULONG' [C++ Error] powrprof.h(40): E2139 Declaration missing ; [C++ Error] powrprof.h(44): E2303 Type name expected [C++ Error] powrprof.h(44): E2139 Declaration missing ; [C++ Error] powrprof.h(45): E2303 Type name expected [C++ Error] powrprof.h(45): E2139 Declaration missing ; [C++ Error] powrprof.h(46): E2303 Type name expected [C++ Error] powrprof.h(46): E2238 Multiple declaration for '_GLOBAL_USER_POWER_POLICY::POWER_ACTION_POLICY' [C++ Error] powrprof.h(45): E2344 Earlier declaration of '_GLOBAL_USER_POWER_POLICY::POWER_ACTION_POLICY' [C++ Error] powrprof.h(46): E2139 Declaration missing ; [C++ Error] powrprof.h(47): E2303 Type name expected [C++ Error] powrprof.h(47): E2238 Multiple declaration for '_GLOBAL_USER_POWER_POLICY::POWER_ACTION_POLICY' [C++ Error] powrprof.h(46): E2344 Earlier declaration of '_GLOBAL_USER_POWER_POLICY::POWER_ACTION_POLICY' [C++ Error] powrprof.h(47): E2139 Declaration missing ; [C++ Error] powrprof.h(48): E2303 Type name expected [C++ Error] powrprof.h(48): E2228 Too many error or warning messages 是什么原因导致的?
ccrun.com 2014-11-26
  • 打赏
  • 举报
回复
补充一下,如果在C6中想静态调用这个函数,就自己用implib从PowrProf.dll中生成CB能用的.lib文件,然后加入到工程中,再自己声明一下TPowerDuplicateScheme函数的原型就可以使用了。
ccrun.com 2014-11-26
  • 打赏
  • 举报
回复
首先说一下 .h 文件 .lib 文件 和 .dll 文件的用处以及何时用到的问题: .h 文件在编译时需要,通常包含了类/函数/对象的声明 .lib 文件(这里指DLL的导入库) 在链接时需要,包含了 .dll 文件导出的函数/对象的一些信息 .dll 文件在运行时需要,包含了具体的函数/对象的实现 对于 PowerDuplicateScheme 函数来说,链接时需要 PowrProf.lib 文件,在高版本的C++Builder中已经自带了,直接包含了头文件,并且将相应的PowrProf.lib文件加到工程中就行了。但是 CBuilder6.0 中是木有的,所以如果在C6中用,就需要动态调用这个函数了,大概代码如下:
typedef DWORD (WINAPI *TPowerDuplicateScheme)(HKEY, const GUID *, GUID **);
HINSTANCE hDll = ::LoadLibraryW(L"PowrProf.dll");
if (hDll)
{
    TPowerDuplicateScheme pds = (TPowerDuplicateScheme)::GetProcAddress(hDll, "PowerDuplicateScheme");
    if (pds)
    {
        // 调用PowerDuplicateScheme的代码写在这里:
        // pds(aa, bb, cc);
        // ...
    }

    ::FreeLibrary(hDll);
}
lianrouwupan 2014-11-26
  • 打赏
  • 举报
回复
引用 6 楼 ccrun 的回复:
你已经包含了头文件 <powrprof.h> 就不要在代码中再添加 PowerDuplicateScheme 的声明了。 并且,你一直不肯说自己用的是C++Builder哪个版本,那么这个机密我也就不再问你了。除了上面说的,还有个问题是你的 GUID_BALANCED 没有定义,需要自己定义一下。

#include <vcl.h>
#include <powrprof.h>
#pragma link "C:\\Program Files\\Borland\\CBuilder6\\Lib\\powrprof.lib"
#pragma hdrstop


#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

const GUID FAR GUID_POWER_SAVER ={ 0xa1841308, 0x3541, 0x4fab, { 0xbc, 0x81, 0xf7, 0x15, 0x56, 0xf2, 0x0b, 0x4a } }; // 节能
//a1841308-3541-4fab-bc81-f71556f20b4a

const GUID FAR GUID_BALANCED ={ 0x381b4222, 0xf694, 0x41f0, { 0x96, 0x85, 0xff, 0x5b, 0xb2, 0x60, 0xdf, 0x2e } }; // 平横
//381b4222-f694-41f0-9685-ff5bb260df2e

const GUID FAR GUID_HIGH_PERFORMANCE ={ 0x8c5e7fda, 0xe8bf, 0x4a96, { 0x9a, 0x85, 0xa6, 0xe2, 0x3a, 0x8c, 0x63, 0x5c } }; // 高性能

void __fastcall TForm1::Button1Click(TObject *Sender)
{
   WCHAR displayBuffer[_MAX_PATH] = L"超级节能";
   DWORD displayBufferSize = _MAX_PATH;
   GUID *GUID_HIGH_POWERSAVE = NULL;
   if(ERROR_SUCCESS == PowerDuplicateScheme(NULL,&GUID_BALANCED,&GUID_HIGH_POWERSAVE))
   {
       ShowMessage("DuplicateScheme ok");
   }
}
仍然提示: [C++ Error] Unit1.cpp(34): E2268 Call to undefined function 'PowerDuplicateScheme'
lianrouwupan 2014-11-26
  • 打赏
  • 举报
回复
引用 6 楼 ccrun 的回复:
你已经包含了头文件 <powrprof.h> 就不要在代码中再添加 PowerDuplicateScheme 的声明了。 并且,你一直不肯说自己用的是C++Builder哪个版本,那么这个机密我也就不再问你了。除了上面说的,还有个问题是你的 GUID_BALANCED 没有定义,需要自己定义一下。
标题不是写着了吗?BCB6....

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧