declspec et stdcall vs declspec seulement
Je suis une nouvelle personne à la dll C++ à l'importation du sujet et peut être ma question est très simple, mais je ne peux pas le trouver sur google.
J'ai une question très simple en C++ win32 dll:
#include <iostream>
using namespace std;
extern "C"
{
__declspec(dllexport) void __stdcall DisplayHellowFromDLL()
{
cout<<"Hi"<<endl;
}
}
Quand j'ai appeler cette méthode à partir de C# je n'ai pas de problème, voici le code C#
namespace UnmanagedTester
{
class Program
{
[DllImport(@"C:\CGlobalDll")]
public static extern void DisplayHellowFromDLL();
static void Main(string[] args)
{
Console.WriteLine("This is C# program");
DisplayHellowFromDLL();
}
}
}
Comme je l'ai attendu la sortie est: "C'est le programme C#" "Salut".
Maintenant si je change la déclaration de la fonction C:
__declspec(dllexport) void DisplayHellowFromDLL()
sans __stdcall, je n'ai pas de problème, et la question est:
Quand dois-je vraiment besoin de __declspec(dllexport) TYPE __stdcall et quand je peux utiliser seulement __declspec(dllexport) TYPE ?
Merci beaucoup.
OriginalL'auteur ilyaw77 | 2011-06-13
Vous devez vous connecter pour publier un commentaire.
Vous devez spécifier la convention d'appel si vous compilez le code d'appel avec un autre convention. Sinon, la valeur par défaut de travail.
OriginalL'auteur Bo Persson
Vous pouvez y penser comme ceci:
__declspec(dllexport)
déclare votre fonction comme une fonction publique que votre DLL exportations;__stdcall
est un assez faible niveau de détail qui fait référence à la "convention d'appel" adopté par cette fonction; en particulier,__stdcall
signifie que le destinataire de l'appel nettoie la pile;alternative à
__stdcall
est__cdecl
, ce qui signifie que: l'appelant nettoie la pile.__cdecl
est "naturel" convention d'appel C; il prend en charge la définition de vararg fonctions (comme printf).__stdcall
est la convention d'appel par défaut pour les fonctions de la DLL, de sorte que vous n'avez pas besoin de spécifier si vous allez seulement d'appeler ces fonctions par le biais de leur API DLL.Ceci devrait expliquer ce que vous observez.
OriginalL'auteur sergio
Il fonctionne par accident, parce que la fonction ne prend aucun argument. Dès que vous faites cela sur une fonction qui ne prendre des arguments, vous allez commencer à courir hors de la chance. L'appel sera de laisser la pile déséquilibré, très malsain. Vous obtiendrez le pInvokeStackImbalance MDA avertissement lors du débogage. Un déséquilibre de la pile peut passer inaperçue pendant un certain temps, il a tendance à bloquer votre programme dans la version Release.
Mettez la plate-forme cible pour x86.
Hans, je l'ai fait sur mon VS2008, exécuter, sans aucune exception ou des avertissements.
Eh bien, la bonne chose que vous avez déjà accepté une réponse.
Il est possible que p/invoke est de deviner la convention d'appel basé sur la déformation d'un nom (trait de soulignement indique généralement cdecl, en traînant @count indique stdcall)
OriginalL'auteur Hans Passant
Ilya, vous pouvez également définir la convention d'appel par défaut dans les Propriétés du Projet -> Propriétés de Configuration -> C/C++ -> Avancé> Convention d'Appel.
Si la convention d'appel par défaut dans votre projet est déjà défini à l' __stdcall (/Gz), puis en ajoutant __mst
OriginalL'auteur maszoka