Я создал dll C++/cli в visual studio 2010 с параметром CLR, как показано ниже, и создал файл email.dll. Затем проверить это создал еще один проект VS2010 win32 и пытался загрузить email.dll с помощью LoadLibrary, который alwyas возвращается NULL:LoadLibrary не загружается C++ CLI, созданный dll
HINSTANCE hGetProcIDDLL = LoadLibrary((LPCWSTR)"pathto\\email.dll");
Мой вопрос: Должен ли email.dll быть загружен каким-либо другим способом ? или если mail.dll создается правильно.
Код C++/CLI для email.cpp: Определяет экспортированные функции для приложения DLL.
#using <mscorlib.dll>
#using <system.dll>
include "stdafx.h"
using namespace System;
using namespace System::Net::Mail;
extern int CallSendEmailFromGmail(char* fromEmail, char* password, char* toEmail, char* subject, char* message);
extern "C"
{
__declspec(dllexport) int SendEmailFromGmail(char* fromEmail, char* password, char* toEmail, char* subject, char* message)
{
return CallSendEmailFromGmail(fromEmail, password, toEmail, subject, message);
}
}
int CallSendEmailFromGmail(char* fromEmail, char* password, char* toEmail, char* subject, char* message)
{
String ^from = gcnew String(fromEmail);
String ^pwd = gcnew String(password);
String ^to = gcnew String(toEmail);
String ^subjectStr = gcnew String(subject);
String ^messageStr = gcnew String(message);
SmtpClient ^client = gcnew SmtpClient();
// client->DeliveryMethod = SmtpDeliveryMethod.Network;
client->UseDefaultCredentials = false;
client->Credentials = gcnew System::Net::NetworkCredential(from, pwd);
client->Port = 587;
client->Host = "smtp.gmail.com";
client->EnableSsl = true;
MailMessage ^mail = gcnew MailMessage(from, to);
mail->Subject = subjectStr;
mail->Body = messageStr;
try
{
client->Send(mail);
}
catch (Exception ^ex)
{
Console::WriteLine("Message : " + ex->Message);
return 1;
}
Console::WriteLine("Message : Done");
return 0;
}
Вам нужно будет отказаться от привычки использовать бросок, чтобы заставить компилятор прекратить сообщать вам, что вы сделали это неправильно. (LPCWSTR) останавливает компилятор от жалобы, это не мешает вам сделать это неправильно. Вы префикс строкового литерала с L, чтобы сделать его широкой строкой, например L "Это широкая строка". Использование LoadLibrary() также неверно, вы используете Assembly :: LoadFrom() для загрузки управляемой сборки. Для этого очень мало смысла, просто добавьте ссылку на сборку, чтобы CLR автоматически загрузила DLL для вас. –
@HansPassant Он тестирует свою экспортированную точку входа функции. –
Спасибо, Ханс и Том! – Suvesh