2
|
utku_karatas · 技术社区 · 15 年前 |
![]() |
1
3
一种方法可能是先解决问题 变成 一个问题,我的意思是调整someObject的类以维护someString(ansisomeString?)的ANSI编码版本。对于您来说,除了原始somestring之外,还可以将这两个值保持在somestring属性的“setter”中(使用您已经进行的相同的utf8>ansi转换)。 在非Unicode版本的编译器中,ansisomeString只不过是somestring字符串的“副本”,当然这不是一个副本,只是somestring上的附加引用计数。在Unicode版本中,它引用了与原始somestring具有相同“生存期”的单独的ANSI编码。
在你的填充结构中…函数,只需将代码更改为引用ansisomeString属性-这完全独立于是否为Unicode编译。
|
![]() |
2
2
至少有三种方法可以做到这一点。
不幸的是,它们都不是完美的解决方案。所以看看这些选项,决定哪一个最适合你。 |
![]() |
3
2
希望您的应用程序中已经有了代码,可以正确地处理所有动态分配的记录。
功能:
顺便说一句:如果传递给dll的记录是调用dll函数的过程或函数中的堆栈变量,您甚至不会遇到这个问题。在这种情况下,只有在多个unicode版本中才需要临时字符串缓冲区
编辑: 你在评论中写道:
您确定不能使用此解决方案吗?重点是,从DLL的POV来看,结构根本没有被修改。也许我没说清楚,但DLL会 不 关心传递给它的结构是否正是它的 宣布 成为。它将被传递一个指向该结构的指针,并且该指针需要指向一个至少与该结构一样大的内存块,并且需要具有相同的内存布局。但是,它可以是一个内存块, 更大的 而不是原始结构,并包含附加数据。 这实际上在WindowsAPI中的很多地方都使用。你有没有想过为什么WindowsAPI中的结构首先包含一个给定结构大小的序数值?它是API发展的关键,同时保持向后兼容性。每当API函数需要新的信息工作时,它只是 附加的 并声明该结构的新版本。请注意,结构的旧版本的内存布局是保留的。DLL的旧客户端仍然可以调用新函数,该函数将使用结构的大小成员来确定调用哪个API版本。
在您的情况下,就DLL而言,不存在结构的不同版本。但是,如果保留了实际结构的内存布局,并且只保留了额外的数据,那么您可以自由地为应用程序声明比实际大小更大的数据。
附加的
.唯一不起作用的情况是,结构的最后一部分是一个大小不同的记录,类似于窗口。
|
![]() |
4
-1
pchar(ansisting(someobject.somestring))不会工作吗? |
![]() |
M - · 为什么两个相同的表情符号不相等? 2 年前 |
![]() |
Mohsen · 将字符串从Windows 1256转换为UTF-8 6 年前 |
![]() |
AMINA ARSHAD · 从字符转换为Unicode数字时出错 6 年前 |
![]() |
Taqwa · 在C#[已关闭]中将上标转换为Unicode 6 年前 |