C++ 调用DLL函数的问题

C++ 调用DLL函数的问题,c++,windows,visual-c++,dll,C++,Windows,Visual C++,Dll,代码: #包括 #包括 #包括 使用名称空间std; void calldll(); int main(int argc,char*argv[]) { calldll(); 系统(“暂停”); 返回退出成功; } void calldll() { 海恩斯和我; LoadMe=LoadLibrary(“Trans_ATL.dll”); 如果(LoadMe!=0) CUT最有可能是0,因为在DLL中找不到的符号没有被发现,这表明(a)它不是在那里,或者(b)函数名称中可能有一个键值,或者(c)函数名

代码:

#包括
#包括
#包括
使用名称空间std;
void calldll();
int main(int argc,char*argv[])
{
calldll();
系统(“暂停”);
返回退出成功;
}
void calldll()
{
海恩斯和我;
LoadMe=LoadLibrary(“Trans_ATL.dll”);
如果(LoadMe!=0)

CUT

最有可能是0,因为在DLL中找不到的符号没有被发现,这表明(a)它不是在那里,或者(b)函数名称中可能有一个键值,或者(c)函数名可能被损坏,因为它被导出为修饰名。C++中出现了很多……/P>


除非导出这四个函数的库在您的控制之下,否则请使用
dumpbin/EXPORTS
并查看符号的正确拼写。

很可能是0,因为您试图在DLL中找到的符号未找到,这表明(a)它不存在或(b)在函数名中可能有一个键错,或者(c)函数名可能被损坏,因为它被导出为修饰名。C++中出现了很多……/P>
    #include <cstdlib>
    #include <iostream>
    #include <windows.h>
    using namespace std;

void calldll();

int main(int argc, char *argv[])
{
    calldll();
    system("PAUSE");
    return EXIT_SUCCESS;
}

void calldll()
{
     HINSTANCE LoadMe;
     LoadMe = LoadLibrary("Trans_ATL.dll");
     if(LoadMe!=0)

        cout<<"loaded successfully\n";

     else

        cout<<"loading error\n";



   /* get pointer to the functions in the dll*/
   FARPROC function01 = GetProcAddress(LoadMe,"EnableLastCharTashkeel");
   FARPROC function02 = GetProcAddress(LoadMe,"EnableEmphaticLAM_RAA");
   FARPROC function03 = GetProcAddress(LoadMe,"SetText");
   FARPROC function04 = GetProcAddress(LoadMe,"GetResult");
   typedef void (__stdcall * pICFUNC01)(bool);
   typedef void (__stdcall * pICFUNC02)(bool);
   typedef bool (__stdcall * pICFUNC03)(string);
   typedef string (__stdcall * pICFUNC04)(string);

   pICFUNC01 EnableLastCharTashkeel_function;
   EnableLastCharTashkeel_function = pICFUNC01(function01);

   pICFUNC02 EnableEmphaticLAM_RAA_function;
   EnableEmphaticLAM_RAA_function = pICFUNC02(function02);

   pICFUNC03 SetText_function;
   SetText_function = pICFUNC03(function03);

   pICFUNC04 GetResult_function;
   GetResult_function = pICFUNC04(function04);

   EnableLastCharTashkeel_function(true);

   EnableEmphaticLAM_RAA_function(true);



   FreeLibrary(LoadMe);




}
除非导出这四个函数的库在您的控制之下,否则请使用
dumpbin/EXPORTS
并查看符号的正确拼写

    #include <cstdlib>
    #include <iostream>
    #include <windows.h>
    using namespace std;

void calldll();

int main(int argc, char *argv[])
{
    calldll();
    system("PAUSE");
    return EXIT_SUCCESS;
}

void calldll()
{
     HINSTANCE LoadMe;
     LoadMe = LoadLibrary("Trans_ATL.dll");
     if(LoadMe!=0)

        cout<<"loaded successfully\n";

     else

        cout<<"loading error\n";



   /* get pointer to the functions in the dll*/
   FARPROC function01 = GetProcAddress(LoadMe,"EnableLastCharTashkeel");
   FARPROC function02 = GetProcAddress(LoadMe,"EnableEmphaticLAM_RAA");
   FARPROC function03 = GetProcAddress(LoadMe,"SetText");
   FARPROC function04 = GetProcAddress(LoadMe,"GetResult");
   typedef void (__stdcall * pICFUNC01)(bool);
   typedef void (__stdcall * pICFUNC02)(bool);
   typedef bool (__stdcall * pICFUNC03)(string);
   typedef string (__stdcall * pICFUNC04)(string);

   pICFUNC01 EnableLastCharTashkeel_function;
   EnableLastCharTashkeel_function = pICFUNC01(function01);

   pICFUNC02 EnableEmphaticLAM_RAA_function;
   EnableEmphaticLAM_RAA_function = pICFUNC02(function02);

   pICFUNC03 SetText_function;
   SetText_function = pICFUNC03(function03);

   pICFUNC04 GetResult_function;
   GetResult_function = pICFUNC04(function04);

   EnableLastCharTashkeel_function(true);

   EnableEmphaticLAM_RAA_function(true);



   FreeLibrary(LoadMe);




}
这是一个保证为NULL的值。调用该函数时,您没有检查函数是否成功。导出的函数未命名为“EnableLastCharTashkeel”。更可能的字符串是“?EnableLastCharTashkeel@@YAX”_N@Z“这是C++编译器将其函数化后的函数名称,是支持重载函数的一种技巧。

您可以声明函数extern“C”,它抑制名称混乱并使函数名为“\u EnableLastCharTashkeel”。请注意,32位编译器使用前导下划线来标记函数使用_cdecl调用约定。为确保从Visual Studio命令提示符对DLL运行Dumpbin.exe/exports,它会显示导出的名称

这是一个保证为NULL的值。调用该函数时,您没有检查函数是否成功。导出的函数未命名为“EnableLastCharTashkeel”。更可能的字符串是“?EnableLastCharTashkeel@@YAX”_N@Z“这是C++编译器将其函数化后的函数名称,是支持重载函数的一种技巧。


您可以声明函数extern“C”,它抑制名称混乱并使函数名为“\u EnableLastCharTashkeel”请注意,32位编译器使用前导下划线来标记函数使用了_cdecl调用约定。可以肯定的是,从Visual Studio命令提示符对DLL运行Dumpbin.exe/exports,它会显示导出的名称。

那么,您的DLL是否真的导出了这些函数?在Visual Studio中,您可以使用
\u declspec执行此操作(dllexport)
就在函数前面,例如
\uu declspec(dllexport)void myFunc(){…}
。或者您可以使用
.def
文件导出函数。我使用了一个小程序来查看此DLL中的函数名,因为它不是我的,我得到了函数名:ITransCript::EnableEmphanticFatha地址:相对地址:序号:5(0x5)文件名:Trans_ATL.dll完整路径:G:\Trans_ATL.dll Type:COM方法因此,您看到的类型是COM。如果我上面发布的代码不够,您可以详细解释如何导出它,因为这是我第一次处理dll。谢谢uWell,你的dll真的导出了那些函数吗?在Visual Studio中,你可以在函数前面加一个
\uuudeclspec(dllexport)
,例如
\uudeclspec(dllexport)void myFunc(){…}
。或者您可以使用
.def
文件导出函数。我使用了一个小程序来查看此DLL中的函数名,因为它不是我的,我得到了函数名:ITransCript::EnableEmphanticFatha地址:相对地址:序号:5(0x5)文件名:Trans_ATL.dll完整路径:G:\Trans_ATL.dll Type:COM方法因此,您看到的类型是COM。如果我上面发布的代码不够,您可以详细解释如何导出它,因为这是我第一次处理dll。谢谢U谢谢大家,但我使用了一个名为dll export viewer的小程序,它显示了我使用的函数名称相同,但没有导出类型,但COM方法这在调用中有区别请简要说明步骤,因为我在处理这些文件方面是全新的,谢谢。我在vs中也使用了Dumpbin.exe/exports,它给出了其他函数类型为导出,但我使用的函数是COM,正如我之前所说的,如果它们是COM方法,则肯定不起作用。COM服务器通常只有4个导出。其中之一是DllGetClassObject,COM对象的工厂。谢谢大家,但我使用了一个名为dll导出查看器的小程序它显示了我使用的函数具有相同的名称,但没有导出类型,但COM方法这在调用中有区别请简要解释步骤,因为我在处理这些文件方面是全新的,这要感谢advancei,我还在vs中使用了Dumpbin.exe/exports,它提供了其他类型导出的函数,但我使用的函数是正如我之前所说的,如果它们是COM方法,则肯定不起作用。COM服务器通常只有4个导出。其中之一是DllGetClassObject,COM对象的工厂。