以下是调用C++/CLI DLL的Delphi代码:
implementation
{$R *.DFM}
procedure CallMe(x: Integer); stdcall; external 'CppWrapper.dll';
procedure TForm1.Button1Click(Sender: TObject);
begin
CallMe(1);
end;
end.
Run Code Online (Sandbox Code Playgroud)
单击表单按钮后,我得到一个例外.
C++ Windows窗体应用程序是否需要.NET Framework?
它似乎是因为它导入了"System :: Forms",但我只想100%肯定.我尝试用依赖打开它,看起来它导入了通常的C++ dll,但是没有任何关于框架的东西.
我有一个HBitmap,我从我用来转换PDF文档中的页面的API中收到.生成的位图是24位彩色位图.我试图确定,使用制作成pdfs的黑白扫描图像,在Foxit生成的位图上是黑白的.Foxit是PDF API.这是一些代码!(C/CLI)
// Get HBITMAP using Foxit's RenderPage function
// to convert to dib later
IntPtr hbitmap = FlattenPageToHBitmap(filename, page);
if (hbitmap == IntPtr::Zero)
return IntPtr::Zero;
Bitmap^ b = Bitmap::FromHbitmap(hbitmap);
bool isColor = false;
for (int y = 0; y < b->Height; y++)
{
for (int x = 0; x < b->Width; x++)
{
Color^ c = b->GetPixel(x, y);
unsigned int bits = (int)c->ToArgb();
bits = bits << 8;
bits = bits >> 8; //should get rid of A in …Run Code Online (Sandbox Code Playgroud) 我正在尝试更新两个链接TextBoxes.我在一个中禁用事件然后使用例如SendKeys::Send("A");首先给它焦点发送击键:
texBox2->Focus();
texBox2->KeyDown -= gcnew KeyEventHandler(this, &Form1::texBox2_KeyDown);
SendKeys::Send("A");
texBox2->KeyDown += gcnew KeyEventHandler(this, &Form1::texBox2_KeyDown);
Run Code Online (Sandbox Code Playgroud)
它几乎可以工作,但完全是心理而不是重复这个角色(我不敢去检查哪个确切的键因为我疯狂地消防溢出)直到我按下control-alt-del.没有其他键有任何影响,鼠标冻结.但任务经理奇迹般地恢复了我的控制权,我不会停止或杀死任何东西.
任何人都可以建议吗?调试器挂起在该SendKeys::Send("A");语句上.
如果我有字符串:
String^ str ="hhB2LWq50a+9HZiNLKuwdQ==.pdf aaaaaaaa bbbbbbbbb cccccdddddeee ffffffgggghhh";
Run Code Online (Sandbox Code Playgroud)
我想提取它的第一部分
hhB2LWq50a+9HZiNLKuwdQ==.pdf
如何在C++/CLI或C#中做到这一点?
我想在Visual C++环境中将std :: string转换为System :: String ^.我知道我们可以通过MarshalStringFunction 将System :: String转换为std :: string,如下所示:
void MarshalString ( String ^ s, string& os ) {
using namespace Runtime::InteropServices;
const char* chars =
(const char*)(Marshal::StringToHGlobalAnsi(s)).ToPointer();
os = chars;
Marshal::FreeHGlobal(IntPtr((void*)chars));
}
Run Code Online (Sandbox Code Playgroud)
我找不到将std :: string转换为System :: String的方法,但我发现System :: String的构造函数带有如下参数:
System::String(Char* value, Int32 startIndex, Int32 length)
Run Code Online (Sandbox Code Playgroud)
我尝试使用下面的代码,但它无法给我一个正确的解决方案:
std::string str1 = "MyString";
System::String^ str = new System::String(str1.c_str(), 0, str1.length());
Run Code Online (Sandbox Code Playgroud)
我的代码出了什么问题?
我想在c ++/cli中更改XmlElement的Name属性.
我想这样做myXmlElem.Name = "xyz",但编译器告诉我,我不能对Name属性进行set操作.
即
<abc/>
Run Code Online (Sandbox Code Playgroud)
变成
<xyz/>
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
谢谢!
我正在尝试在C++/CLI中围绕.Net库创建一个本机包装器,以便常规C++代码可以使用它.对于这个例子,假设这是我试图包装的C#代码:
class Foo
{
public Bar GetBar() {...}
public string SomeProperty { get; set; }
}
class Bar
{
public void Baz() {...}
}
Run Code Online (Sandbox Code Playgroud)
我基本上是在C++/CLI(dll项目)中大致尝试这样做:
class __declspec(dllexport) NativeFoo
{
public:
NativeBar GetBar();
std::string GetName();
void SetName(const std::string &value);
private:
Foo ^m_foo;
};
class __declspec(dllexport) NativeBar
{
friend class NativeFoo;
public:
void Baz();
private:
Bar(Bar ^bar);
Bar ^m_bar;
};
Run Code Online (Sandbox Code Playgroud)
这样,C++库可以链接到这个,使用NativeFoo就好像它是一个普通的C++类.在内部,NativeFoo将转换参数以将实现传递给m_foo,将任何管理的内容编组回本机表示并将其返回给其调用者...
但是,我遇到的问题是我不能拥有非托管类的托管成员:
error C3265: cannot declare a managed 'm_bar' in an unmanaged 'NativeFoo'
Run Code Online (Sandbox Code Playgroud)
类似地,我不能将NativeFoo标记为"ref"(作为托管类本身)因为那时我无法导出它:
C3386: 'NativeFoo' : __declspec(dllexport)/__declspec(dllimport) cannot be applied to …Run Code Online (Sandbox Code Playgroud) 我在Visual Studio 2015中创建了一个新的C ++ CLR项目,并想尝试在C ++中使用Linq功能。为此,我想包含名称空间System :: Linq。不幸的是VS声称
Error C2039 'Linq': is not a member of 'System' ConsoleApplication1
Run Code Online (Sandbox Code Playgroud)
这是整个代码:
using namespace System;
using namespace System::Linq;
int main(array<System::String ^> ^args)
{
Console::WriteLine(L"Hello World");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如何使它工作?